X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fwin32ss%2Fprinting%2Fproviders%2Flocalspl%2Fprintprocessors.c;h=5d6c178636e258a7413f81bbc6cbbc72040e3a01;hp=a8b9a8951ed0e0ce3268fb84fe9a010a610b9161;hb=2e94fb273dcfe0ef2e94ed6e7514d7f5ccedffbd;hpb=9be537abb7877b6b2c69be352f69f1a0269533ce diff --git a/reactos/win32ss/printing/providers/localspl/printprocessors.c b/reactos/win32ss/printing/providers/localspl/printprocessors.c index a8b9a8951ed..5d6c178636e 100644 --- a/reactos/win32ss/printing/providers/localspl/printprocessors.c +++ b/reactos/win32ss/printing/providers/localspl/printprocessors.c @@ -24,18 +24,16 @@ static LIST_ENTRY _PrintProcessorList; * You can use it for further tasks and have to close it with RegCloseKey. * * @return - * TRUE if the environment is valid and a registry key was opened, FALSE otherwise. - * In case of failure, Last Error will be set to ERROR_INVALID_ENVIRONMENT. + * A Windows Error Code indicating success or failure. */ -static BOOL +static DWORD _OpenEnvironment(PCWSTR pEnvironment, PHKEY hKey) { const WCHAR wszEnvironmentsKey[] = L"SYSTEM\\CurrentControlSet\\Control\\Print\\Environments\\"; const DWORD cchEnvironmentsKey = _countof(wszEnvironmentsKey) - 1; - BOOL bReturnValue = FALSE; DWORD cchEnvironment; - LONG lStatus; + DWORD dwErrorCode; PWSTR pwszEnvironmentKey = NULL; // Use the current environment if none was supplied. @@ -55,29 +53,27 @@ _OpenEnvironment(PCWSTR pEnvironment, PHKEY hKey) CopyMemory(&pwszEnvironmentKey[cchEnvironmentsKey], pEnvironment, (cchEnvironment + 1) * sizeof(WCHAR)); // Open the registry key. - lStatus = RegOpenKeyExW(HKEY_LOCAL_MACHINE, pwszEnvironmentKey, 0, KEY_READ, hKey); - if (lStatus == ERROR_FILE_NOT_FOUND) + dwErrorCode = (DWORD)RegOpenKeyExW(HKEY_LOCAL_MACHINE, pwszEnvironmentKey, 0, KEY_READ, hKey); + if (dwErrorCode == ERROR_FILE_NOT_FOUND) { - SetLastError(ERROR_INVALID_ENVIRONMENT); + dwErrorCode = ERROR_INVALID_ENVIRONMENT; goto Cleanup; } - else if (lStatus != ERROR_SUCCESS) + else if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegOpenKeyExW failed with status %ld!\n", lStatus); + ERR("RegOpenKeyExW failed with status %lu!\n", dwErrorCode); goto Cleanup; } - bReturnValue = TRUE; - Cleanup: if (pwszEnvironmentKey) DllFreeSplMem(pwszEnvironmentKey); - return bReturnValue; + return dwErrorCode; } BOOL -FindDatatype(PLOCAL_PRINT_PROCESSOR pPrintProcessor, PWSTR pwszDatatype) +FindDatatype(const PLOCAL_PRINT_PROCESSOR pPrintProcessor, PCWSTR pwszDatatype) { DWORD i; PDATATYPES_INFO_1W pCurrentDatatype = pPrintProcessor->pDatatypesInfo1; @@ -94,12 +90,12 @@ FindDatatype(PLOCAL_PRINT_PROCESSOR pPrintProcessor, PWSTR pwszDatatype) } PLOCAL_PRINT_PROCESSOR -FindPrintProcessor(PWSTR pwszName) +FindPrintProcessor(PCWSTR pwszName) { PLIST_ENTRY pEntry; PLOCAL_PRINT_PROCESSOR pPrintProcessor; - for (pEntry = _PrintProcessorList.Flink; pEntry; pEntry = pEntry->Flink) + for (pEntry = _PrintProcessorList.Flink; pEntry != &_PrintProcessorList; pEntry = pEntry->Flink) { pPrintProcessor = CONTAINING_RECORD(pEntry, LOCAL_PRINT_PROCESSOR, Entry); @@ -115,7 +111,7 @@ FindPrintProcessor(PWSTR pwszName) * * Initializes a singly linked list of locally available Print Processors. */ -void +BOOL InitializePrintProcessorList() { DWORD cbDatatypes; @@ -123,15 +119,14 @@ InitializePrintProcessorList() DWORD cchPrintProcessorPath; DWORD cchMaxSubKey; DWORD cchPrintProcessorName; + DWORD dwErrorCode; DWORD dwSubKeys; DWORD i; HINSTANCE hinstPrintProcessor; HKEY hKey = NULL; HKEY hSubKey = NULL; HKEY hSubSubKey = NULL; - LONG lStatus; PLOCAL_PRINT_PROCESSOR pPrintProcessor = NULL; - PWSTR pwszPrintProcessorName = NULL; WCHAR wszFileName[MAX_PATH]; WCHAR wszPrintProcessorPath[MAX_PATH]; @@ -140,36 +135,32 @@ InitializePrintProcessorList() // Prepare the path to the Print Processor directory. if (!LocalGetPrintProcessorDirectory(NULL, NULL, 1, (PBYTE)wszPrintProcessorPath, sizeof(wszPrintProcessorPath), &cchPrintProcessorPath)) + { + dwErrorCode = GetLastError(); goto Cleanup; + } cchPrintProcessorPath /= sizeof(WCHAR); wszPrintProcessorPath[cchPrintProcessorPath++] = L'\\'; // Open the environment registry key. - if (!_OpenEnvironment(NULL, &hKey)) + dwErrorCode = _OpenEnvironment(NULL, &hKey); + if (dwErrorCode != ERROR_SUCCESS) goto Cleanup; // Open the "Print Processors" subkey. - lStatus = RegOpenKeyExW(hKey, L"Print Processors", 0, KEY_READ, &hSubKey); - if (lStatus != ERROR_SUCCESS) + dwErrorCode = (DWORD)RegOpenKeyExW(hKey, L"Print Processors", 0, KEY_READ, &hSubKey); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegOpenKeyExW failed with status %ld!\n", lStatus); + ERR("RegOpenKeyExW failed with status %lu!\n", dwErrorCode); goto Cleanup; } // Get the number of Print Processors and maximum sub key length. - lStatus = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, &dwSubKeys, &cchMaxSubKey, NULL, NULL, NULL, NULL, NULL, NULL); - if (lStatus != ERROR_SUCCESS) - { - ERR("RegQueryInfoKeyW failed with status %ld!\n", lStatus); - goto Cleanup; - } - - // Allocate a temporary buffer for the Print Processor names. - pwszPrintProcessorName = DllAllocSplMem((cchMaxSubKey + 1) * sizeof(WCHAR)); - if (!pwszPrintProcessorName) + dwErrorCode = (DWORD)RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, &dwSubKeys, &cchMaxSubKey, NULL, NULL, NULL, NULL, NULL, NULL); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("DllAllocSplMem failed with error %lu!\n", GetLastError()); + ERR("RegQueryInfoKeyW failed with status %lu!\n", dwErrorCode); goto Cleanup; } @@ -195,36 +186,54 @@ InitializePrintProcessorList() pPrintProcessor = NULL; } + // Create a new LOCAL_PRINT_PROCESSOR structure for it. + pPrintProcessor = DllAllocSplMem(sizeof(LOCAL_PRINT_PROCESSOR)); + if (!pPrintProcessor) + { + dwErrorCode = ERROR_NOT_ENOUGH_MEMORY; + ERR("DllAllocSplMem failed with error %lu!\n", GetLastError()); + goto Cleanup; + } + + // Allocate memory for the Print Monitor Name. + pPrintProcessor->pwszName = DllAllocSplMem((cchMaxSubKey + 1) * sizeof(WCHAR)); + if (!pPrintProcessor->pwszName) + { + dwErrorCode = ERROR_NOT_ENOUGH_MEMORY; + ERR("DllAllocSplMem failed with error %lu!\n", GetLastError()); + goto Cleanup; + } + // Get the name of this Print Processor. - cchPrintProcessorName = cchMaxSubKey; - lStatus = RegEnumKeyExW(hSubKey, i, pwszPrintProcessorName, &cchPrintProcessorName, NULL, NULL, NULL, NULL); - if (lStatus != ERROR_SUCCESS) + cchPrintProcessorName = cchMaxSubKey + 1; + dwErrorCode = (DWORD)RegEnumKeyExW(hSubKey, i, pPrintProcessor->pwszName, &cchPrintProcessorName, NULL, NULL, NULL, NULL); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegEnumKeyExW failed with status %ld!\n", lStatus); + ERR("RegEnumKeyExW failed with status %ld!\n", dwErrorCode); continue; } // Open this Print Processor's registry key. - lStatus = RegOpenKeyExW(hSubKey, pwszPrintProcessorName, 0, KEY_READ, &hSubSubKey); - if (lStatus != ERROR_SUCCESS) + dwErrorCode = (DWORD)RegOpenKeyExW(hSubKey, pPrintProcessor->pwszName, 0, KEY_READ, &hSubSubKey); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegOpenKeyExW failed for Print Processor \"%S\" with status %ld!\n", pwszPrintProcessorName, lStatus); + ERR("RegOpenKeyExW failed for Print Processor \"%S\" with status %lu!\n", pPrintProcessor->pwszName, dwErrorCode); continue; } // Get the file name of the Print Processor. cbFileName = sizeof(wszFileName); - lStatus = RegQueryValueExW(hSubSubKey, L"Driver", NULL, NULL, (PBYTE)wszFileName, &cbFileName); - if (lStatus != ERROR_SUCCESS) + dwErrorCode = (DWORD)RegQueryValueExW(hSubSubKey, L"Driver", NULL, NULL, (PBYTE)wszFileName, &cbFileName); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegQueryValueExW failed for Print Processor \"%S\" with status %ld!\n", pwszPrintProcessorName, lStatus); + ERR("RegQueryValueExW failed for Print Processor \"%S\" with status %lu!\n", pPrintProcessor->pwszName, dwErrorCode); continue; } // Verify that our buffer is large enough. if (cchPrintProcessorPath + cbFileName / sizeof(WCHAR) > MAX_PATH) { - ERR("Print Processor directory \"%S\" for Print Processor \"%S\" is too long!\n", wszFileName, pwszPrintProcessorName); + ERR("Print Processor directory \"%S\" for Print Processor \"%S\" is too long!\n", wszFileName, pPrintProcessor->pwszName); continue; } @@ -233,16 +242,12 @@ InitializePrintProcessorList() // Try to load it. hinstPrintProcessor = LoadLibraryW(wszPrintProcessorPath); - if (lStatus != ERROR_SUCCESS) + if (!hinstPrintProcessor) { ERR("LoadLibraryW failed for \"%S\" with error %lu!\n", wszPrintProcessorPath, GetLastError()); continue; } - // Create a new LOCAL_PRINT_PROCESSOR structure for it. - pPrintProcessor = DllAllocSplMem(sizeof(LOCAL_PRINT_PROCESSOR)); - pPrintProcessor->pwszName = AllocSplStr(pwszPrintProcessorName); - // Get and verify all its function pointers. pPrintProcessor->pfnClosePrintProcessor = (PClosePrintProcessor)GetProcAddress(hinstPrintProcessor, "ClosePrintProcessor"); if (!pPrintProcessor->pfnClosePrintProcessor) @@ -291,6 +296,7 @@ InitializePrintProcessorList() pPrintProcessor->pDatatypesInfo1 = DllAllocSplMem(cbDatatypes); if (!pPrintProcessor->pDatatypesInfo1) { + dwErrorCode = ERROR_NOT_ENOUGH_MEMORY; ERR("DllAllocSplMem failed with error %lu!\n", GetLastError()); goto Cleanup; } @@ -308,6 +314,8 @@ InitializePrintProcessorList() pPrintProcessor = NULL; } + dwErrorCode = ERROR_SUCCESS; + Cleanup: // Inside the loop if (hSubSubKey) @@ -325,14 +333,14 @@ Cleanup: } // Outside the loop - if (pwszPrintProcessorName) - DllFreeSplStr(pwszPrintProcessorName); - if (hSubKey) RegCloseKey(hSubKey); if (hKey) RegCloseKey(hKey); + + SetLastError(dwErrorCode); + return (dwErrorCode == ERROR_SUCCESS); } /** @@ -372,25 +380,33 @@ Cleanup: BOOL WINAPI LocalEnumPrintProcessorDatatypes(LPWSTR pName, LPWSTR pPrintProcessorName, DWORD Level, LPBYTE pDatatypes, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned) { + DWORD dwErrorCode; PLOCAL_PRINT_PROCESSOR pPrintProcessor; // Sanity checks if (Level != 1) { - SetLastError(ERROR_INVALID_LEVEL); - return FALSE; + dwErrorCode = ERROR_INVALID_LEVEL; + goto Cleanup; } // Try to find the Print Processor. pPrintProcessor = FindPrintProcessor(pPrintProcessorName); if (!pPrintProcessor) { - SetLastError(ERROR_UNKNOWN_PRINTPROCESSOR); - return FALSE; + dwErrorCode = ERROR_UNKNOWN_PRINTPROCESSOR; + goto Cleanup; } // Call its EnumPrintProcessorDatatypesW function. - return pPrintProcessor->pfnEnumPrintProcessorDatatypesW(pName, pPrintProcessorName, Level, pDatatypes, cbBuf, pcbNeeded, pcReturned); + if (pPrintProcessor->pfnEnumPrintProcessorDatatypesW(pName, pPrintProcessorName, Level, pDatatypes, cbBuf, pcbNeeded, pcReturned)) + dwErrorCode = ERROR_SUCCESS; + else + dwErrorCode = GetLastError(); + +Cleanup: + SetLastError(dwErrorCode); + return (dwErrorCode == ERROR_SUCCESS); } /** @@ -431,13 +447,13 @@ LocalEnumPrintProcessorDatatypes(LPWSTR pName, LPWSTR pPrintProcessorName, DWORD BOOL WINAPI LocalEnumPrintProcessors(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, LPBYTE pPrintProcessorInfo, DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned) { - BOOL bReturnValue = FALSE; DWORD cchMaxSubKey; DWORD cchPrintProcessor; + DWORD dwErrorCode; + DWORD dwPrintProcessorCount; DWORD i; HKEY hKey = NULL; HKEY hSubKey = NULL; - LONG lStatus; PBYTE pCurrentOutputPrintProcessor; PBYTE pCurrentOutputPrintProcessorInfo; PRINTPROCESSOR_INFO_1W PrintProcessorInfo1; @@ -446,35 +462,36 @@ LocalEnumPrintProcessors(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, LPBYTE // Sanity checks if (Level != 1) { - SetLastError(ERROR_INVALID_LEVEL); + dwErrorCode = ERROR_INVALID_LEVEL; goto Cleanup; } if (!pcbNeeded || !pcReturned) { - // This error must be caught by RPC and returned as RPC_X_NULL_REF_POINTER. - ERR("pcbNeeded or pcReturned is NULL!\n"); + // This error is also caught by RPC and returned as RPC_X_NULL_REF_POINTER. + dwErrorCode = ERROR_INVALID_PARAMETER; goto Cleanup; } // Verify pEnvironment and open its registry key. // We use the registry and not the PrintProcessorList here, because the caller may request information about a different environment. - if (!_OpenEnvironment(pEnvironment, &hKey)) + dwErrorCode = _OpenEnvironment(pEnvironment, &hKey); + if (dwErrorCode != ERROR_SUCCESS) goto Cleanup; // Open the "Print Processors" subkey. - lStatus = RegOpenKeyExW(hKey, L"Print Processors", 0, KEY_READ, &hSubKey); - if (lStatus != ERROR_SUCCESS) + dwErrorCode = (DWORD)RegOpenKeyExW(hKey, L"Print Processors", 0, KEY_READ, &hSubKey); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegOpenKeyExW failed with status %ld!\n", lStatus); + ERR("RegOpenKeyExW failed with status %lu!\n", dwErrorCode); goto Cleanup; } // Get the number of Print Processors and maximum sub key length. - lStatus = RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, pcReturned, &cchMaxSubKey, NULL, NULL, NULL, NULL, NULL, NULL); - if (lStatus != ERROR_SUCCESS) + dwErrorCode = (DWORD)RegQueryInfoKeyW(hSubKey, NULL, NULL, NULL, &dwPrintProcessorCount, &cchMaxSubKey, NULL, NULL, NULL, NULL, NULL, NULL); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegQueryInfoKeyW failed with status %ld!\n", lStatus); + ERR("RegQueryInfoKeyW failed with status %lu!\n", dwErrorCode); goto Cleanup; } @@ -482,6 +499,7 @@ LocalEnumPrintProcessors(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, LPBYTE pwszTemp = DllAllocSplMem((cchMaxSubKey + 1) * sizeof(WCHAR)); if (!pwszTemp) { + dwErrorCode = ERROR_NOT_ENOUGH_MEMORY; ERR("DllAllocSplMem failed with error %lu!\n", GetLastError()); goto Cleanup; } @@ -489,15 +507,15 @@ LocalEnumPrintProcessors(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, LPBYTE // Determine the required size of the output buffer. *pcbNeeded = 0; - for (i = 0; i < *pcReturned; i++) + for (i = 0; i < dwPrintProcessorCount; i++) { // RegEnumKeyExW sucks! Unlike similar API functions, it only returns the actual numbers of characters copied when you supply a buffer large enough. // So use pwszTemp with its size cchMaxSubKey for this. - cchPrintProcessor = cchMaxSubKey; - lStatus = RegEnumKeyExW(hSubKey, i, pwszTemp, &cchPrintProcessor, NULL, NULL, NULL, NULL); - if (lStatus != ERROR_SUCCESS) + cchPrintProcessor = cchMaxSubKey + 1; + dwErrorCode = (DWORD)RegEnumKeyExW(hSubKey, i, pwszTemp, &cchPrintProcessor, NULL, NULL, NULL, NULL); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegEnumKeyExW failed with status %ld!\n", lStatus); + ERR("RegEnumKeyExW failed with status %lu!\n", dwErrorCode); goto Cleanup; } @@ -507,25 +525,25 @@ LocalEnumPrintProcessors(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, LPBYTE // Check if the supplied buffer is large enough. if (cbBuf < *pcbNeeded) { - SetLastError(ERROR_INSUFFICIENT_BUFFER); + dwErrorCode = ERROR_INSUFFICIENT_BUFFER; goto Cleanup; } // Put the Print Processor strings right after the last PRINTPROCESSOR_INFO_1W structure. pCurrentOutputPrintProcessorInfo = pPrintProcessorInfo; - pCurrentOutputPrintProcessor = pPrintProcessorInfo + *pcReturned * sizeof(PRINTPROCESSOR_INFO_1W); + pCurrentOutputPrintProcessor = pPrintProcessorInfo + dwPrintProcessorCount * sizeof(PRINTPROCESSOR_INFO_1W); // Copy over all Print Processors. - for (i = 0; i < *pcReturned; i++) + for (i = 0; i < dwPrintProcessorCount; i++) { // This isn't really correct, but doesn't cause any harm, because we've extensively checked the size of the supplied buffer above. - cchPrintProcessor = cchMaxSubKey; + cchPrintProcessor = cchMaxSubKey + 1; // Copy the Print Processor name. - lStatus = RegEnumKeyExW(hSubKey, i, (PWSTR)pCurrentOutputPrintProcessor, &cchPrintProcessor, NULL, NULL, NULL, NULL); - if (lStatus != ERROR_SUCCESS) + dwErrorCode = (DWORD)RegEnumKeyExW(hSubKey, i, (PWSTR)pCurrentOutputPrintProcessor, &cchPrintProcessor, NULL, NULL, NULL, NULL); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegEnumKeyExW failed with status %ld!\n", lStatus); + ERR("RegEnumKeyExW failed with status %lu!\n", dwErrorCode); goto Cleanup; } @@ -539,8 +557,8 @@ LocalEnumPrintProcessors(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, LPBYTE } // We've finished successfully! - SetLastError(ERROR_SUCCESS); - bReturnValue = TRUE; + *pcReturned = dwPrintProcessorCount; + dwErrorCode = ERROR_SUCCESS; Cleanup: if (pwszTemp) @@ -552,7 +570,8 @@ Cleanup: if (hKey) RegCloseKey(hKey); - return bReturnValue; + SetLastError(dwErrorCode); + return (dwErrorCode == ERROR_SUCCESS); } /** @@ -592,34 +611,34 @@ LocalGetPrintProcessorDirectory(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, const WCHAR wszPath[] = L"\\PRTPROCS\\"; const DWORD cchPath = _countof(wszPath) - 1; - BOOL bReturnValue = FALSE; DWORD cbDataWritten; + DWORD dwErrorCode; HKEY hKey = NULL; - LONG lStatus; // Sanity checks if (Level != 1) { - SetLastError(ERROR_INVALID_LEVEL); + dwErrorCode = ERROR_INVALID_LEVEL; goto Cleanup; } if (!pcbNeeded) { - // This error must be caught by RPC and returned as RPC_X_NULL_REF_POINTER. - ERR("pcbNeeded is NULL!\n"); + // This error is also caught by RPC and returned as RPC_X_NULL_REF_POINTER. + dwErrorCode = ERROR_INVALID_PARAMETER; goto Cleanup; } // Verify pEnvironment and open its registry key. - if (!_OpenEnvironment(pEnvironment, &hKey)) + dwErrorCode = _OpenEnvironment(pEnvironment, &hKey); + if (dwErrorCode != ERROR_SUCCESS) goto Cleanup; // Determine the size of the required buffer. - lStatus = RegQueryValueExW(hKey, L"Directory", NULL, NULL, NULL, pcbNeeded); - if (lStatus != ERROR_SUCCESS) + dwErrorCode = (DWORD)RegQueryValueExW(hKey, L"Directory", NULL, NULL, NULL, pcbNeeded); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegQueryValueExW failed with status %ld!\n", lStatus); + ERR("RegQueryValueExW failed with status %lu!\n", dwErrorCode); goto Cleanup; } @@ -629,7 +648,7 @@ LocalGetPrintProcessorDirectory(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, // Is the supplied buffer large enough? if (cbBuf < *pcbNeeded) { - SetLastError(ERROR_INSUFFICIENT_BUFFER); + dwErrorCode = ERROR_INSUFFICIENT_BUFFER; goto Cleanup; } @@ -638,20 +657,20 @@ LocalGetPrintProcessorDirectory(LPWSTR pName, LPWSTR pEnvironment, DWORD Level, CopyMemory(&pPrintProcessorInfo[cchSpoolDirectory], wszPath, cchPath * sizeof(WCHAR)); // Get the directory name from the registry. - lStatus = RegQueryValueExW(hKey, L"Directory", NULL, NULL, &pPrintProcessorInfo[cchSpoolDirectory + cchPath], &cbDataWritten); - if (lStatus != ERROR_SUCCESS) + dwErrorCode = (DWORD)RegQueryValueExW(hKey, L"Directory", NULL, NULL, &pPrintProcessorInfo[cchSpoolDirectory + cchPath], &cbDataWritten); + if (dwErrorCode != ERROR_SUCCESS) { - ERR("RegQueryValueExW failed with status %ld!\n", lStatus); + ERR("RegQueryValueExW failed with status %lu!\n", dwErrorCode); goto Cleanup; } // We've finished successfully! - SetLastError(ERROR_SUCCESS); - bReturnValue = TRUE; + dwErrorCode = ERROR_SUCCESS; Cleanup: if (hKey) RegCloseKey(hKey); - return bReturnValue; + SetLastError(dwErrorCode); + return (dwErrorCode == ERROR_SUCCESS); }