Hi.
Could someone look over the following, it’s causing my program to freeze up and subsequently because the program is not responding windows itself.
BOOLEAN Registry(
HKEY hKey, /* hKey. */
LPCTSTR KeyName, /* Either the Path Name for OPENKEY, or the KeyName for entry access. */
PHKEY phKey, /* phKey. */
PWCHAR pBuffer, /* Return and save values from and in WCHAR. */
PDWORD dwBuffer, /* Return the DWORD value. */
DWORD MaximumCharLength, /* Maximum Length of pBuffer for saving. */
DWORD RegistryType) /* Registry Type. */
{
DWORD dwLocalLength;
LPBYTE pbBuffer;
PUCHAR uzBuffer;
DWORD dwRegType;
DWORD dwResult;
DWORD dwInt;
if(pBuffer == NULL) dwLocalLength = sizeof(DWORD); else dwLocalLength = MaximumCharLength;
dwResult = 0;
pbBuffer = (LPBYTE) malloc (dwLocalLength);
uzBuffer = (LPBYTE) malloc (11); /* Maximum DWORD length in characters is 10. */
switch(RegistryType)
{
case OPENKEY:
if (RegOpenKeyEx(hKey, KeyName, 0, KEY_ALL_ACCESS, phKey) != ERROR_SUCCESS)
if (RegCreateKeyEx(hKey, KeyName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, phKey, &dwLocalLength) != ERROR_SUCCESS) break;
else if (RegOpenKeyEx(hKey, KeyName, 0, KEY_ALL_ACCESS, phKey) != ERROR_SUCCESS) break;
free(uzBuffer);
free(pbBuffer);
return TRUE;
case DGETKEY:
if (pBuffer != NULL) break;
if ((dwResult = RegQueryValueEx ((HKEY) *phKey, KeyName, 0, &dwRegType, (LPBYTE) &pbBuffer, &dwLocalLength)) != ERROR_SUCCESS) break;
if (StringCchPrintfA(uzBuffer, 11, “%d”, pbBuffer) != S_OK) break;
*dwBuffer = atoi(uzBuffer);
free(uzBuffer);
free(pbBuffer);
return TRUE;
case DSETKEY:
if (pBuffer != NULL) break;
if ((dwResult = RegSetValueEx ((HKEY) *phKey, KeyName, 0, REG_DWORD, (PBYTE) dwBuffer, sizeof(DWORD))) != ERROR_SUCCESS) break;
free(uzBuffer);
free(pbBuffer);
return TRUE;
case BGETKEY:
if (dwBuffer != NULL) break;
if ((dwResult = RegQueryValueEx ((HKEY) *phKey, KeyName, 0, &dwRegType, (LPBYTE) pbBuffer, &dwLocalLength)) != ERROR_SUCCESS) break;
if (StringCchPrintfW(pBuffer, MaximumCharLength, L"%ws", pbBuffer) != S_OK) break;
free(uzBuffer);
free(pbBuffer);
return TRUE;
case BSETKEY:
if (dwBuffer != NULL) break;
if ((dwResult = RegSetValueEx ((HKEY) *phKey, KeyName, 0, REG_BINARY, (PBYTE) pBuffer, (wcslen(pBuffer)*2)+2)) != ERROR_SUCCESS) break;
free(uzBuffer);
free(pbBuffer);
return TRUE;
case CLSEKEY:
if (RegCloseKey ((HKEY) *phKey) != ERROR_SUCCESS) break;
free(uzBuffer);
free(pbBuffer);
return TRUE;
}
printf(“KeyName=‘%ws’ RegistryType=‘%d’.\n”, KeyName, RegistryType);
printf(“dwResult=‘%d’.\n”, dwResult);
free(uzBuffer);
free(pbBuffer);
return FALSE;
}
The code I use to call it is.
/* if fCheck is set to true there is a time limit for a reply. */
if(pDrvSubMessageRecv->fCheck == TRUE)
{
/* This works. */
printf(“fCheck is set.\n”);
pDrvMessageSend->DrvSubMessageSend.fCheck = TRUE;
pDrvMessageSend->DrvSubMessageSend.fAllow = TRUE;
/* Send back to the driver. */
hResult = FilterReplyMessage(pThreadContext->hPort, (PFILTER_REPLY_HEADER) pDrvMessageSend, sizeof(DRV_MESSAGE_SEND));
if(!SUCCEEDED(hResult))
{
if(StringCchPrintfA (ErrorMessage, MAXIMUM_ERROR_MESSAGE_SIZE, “FilterReplyMessage Error replying message. fCheck. hResult=‘0x%X’ GetLastError=‘%d’.\n”, hResult, GetLastError()) == S_OK) WriteToLog(ErrorMessage);
printf(“[9th].\n”); exit(0); break;
}
}
else
{
/* This freezes while installing visual studio 6. */
printf(“fCheck is not set.\n”);
pDrvMessageSend->DrvSubMessageSend.fAllow = TRUE;
fCreate = 1; fRead = 1; fWrite = 1; bExecute = 1; fAlways = 0;
/* If the connected application pid is this pid, allow everything. */
if(Registry(HKEY_LOCAL_MACHINE, L"Software\Program", &hKey, NULL, NULL, 0, OPENKEY) == TRUE)
{
if(Registry(HKEY_LOCAL_MACHINE, L"SafePid", &hKey, NULL, &dSafePid, 0, DGETKEY) == FALSE) break;
if(Registry(HKEY_LOCAL_MACHINE, L"Software\Program", &hKey, NULL, NULL, 0, CLSEKEY) == FALSE) break;
}
/* Send back to the driver. */
hResult = FilterReplyMessage(pThreadContext->hPort, (PFILTER_REPLY_HEADER) pDrvMessageSend, sizeof(DRV_MESSAGE_SEND));
if(!SUCCEEDED(hResult))
{
if(StringCchPrintfA (ErrorMessage, MAXIMUM_ERROR_MESSAGE_SIZE, “FilterReplyMessage Error replying message. hResult=‘0x%X’ GetLastError=‘%d’.\n”, hResult, GetLastError()) == S_OK) WriteToLog(ErrorMessage);
printf(“[7th].\n”); exit(0); break;
}