mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 02:26:03 +00:00
Replace some casts by CONTAINING_RECORD macro
Fix handle leak in SetupDiOpenClassRegKeyExW svn path=/trunk/; revision=21829
This commit is contained in:
parent
367c18f5d5
commit
12f4770a33
1 changed files with 56 additions and 47 deletions
|
@ -826,7 +826,7 @@ BOOL WINAPI SetupDiEnumDeviceInfo(
|
|||
SetLastError(ERROR_NO_MORE_ITEMS);
|
||||
else
|
||||
{
|
||||
struct DeviceInfoElement *DevInfo = (struct DeviceInfoElement *)ItemList;
|
||||
struct DeviceInfoElement *DevInfo = CONTAINING_RECORD(ItemList, struct DeviceInfoElement, ListEntry);
|
||||
memcpy(&DeviceInfoData->ClassGuid,
|
||||
&DevInfo->ClassGuid,
|
||||
sizeof(GUID));
|
||||
|
@ -1661,6 +1661,7 @@ static LONG SETUP_CreateInterfaceList(
|
|||
|
||||
hInterfaceKey = INVALID_HANDLE_VALUE;
|
||||
hDeviceInstanceKey = INVALID_HANDLE_VALUE;
|
||||
hReferenceKey = INVALID_HANDLE_VALUE;
|
||||
|
||||
/* Open registry key related to this interface */
|
||||
hInterfaceKey = SetupDiOpenClassRegKeyExW(InterfaceGuid, KEY_ENUMERATE_SUB_KEYS, DIOCR_INTERFACE, MachineName, NULL);
|
||||
|
@ -2290,7 +2291,7 @@ BOOL WINAPI SetupDiEnumDeviceInterfaces(
|
|||
while (ItemList != &list->ListHead && !Found)
|
||||
{
|
||||
PLIST_ENTRY InterfaceListEntry;
|
||||
struct DeviceInfoElement *DevInfo = (struct DeviceInfoElement *)ItemList;
|
||||
struct DeviceInfoElement *DevInfo = CONTAINING_RECORD(ItemList, struct DeviceInfoElement, ListEntry);
|
||||
if (DeviceInfoData && (struct DeviceInfoElement *)DeviceInfoData->Reserved != DevInfo)
|
||||
{
|
||||
/* We are not searching for this element */
|
||||
|
@ -2300,7 +2301,7 @@ BOOL WINAPI SetupDiEnumDeviceInterfaces(
|
|||
InterfaceListEntry = DevInfo->InterfaceListHead.Flink;
|
||||
while (InterfaceListEntry != &DevInfo->InterfaceListHead && !Found)
|
||||
{
|
||||
struct DeviceInterface *DevItf = (struct DeviceInterface *)InterfaceListEntry;
|
||||
struct DeviceInterface *DevItf = CONTAINING_RECORD(InterfaceListEntry, struct DeviceInterface, ListEntry);
|
||||
if (!IsEqualIID(&DevItf->InterfaceClassGuid, InterfaceClassGuid))
|
||||
{
|
||||
InterfaceListEntry = InterfaceListEntry->Flink;
|
||||
|
@ -2394,7 +2395,7 @@ static BOOL DestroyDeviceInfoSet(struct DeviceInfoSet* list)
|
|||
while (!IsListEmpty(&list->ListHead))
|
||||
{
|
||||
ListEntry = RemoveHeadList(&list->ListHead);
|
||||
deviceInfo = (struct DeviceInfoElement *)ListEntry;
|
||||
deviceInfo = CONTAINING_RECORD(ListEntry, struct DeviceInfoElement, ListEntry);
|
||||
if (!DestroyDeviceInfoElement(deviceInfo))
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -3330,12 +3331,13 @@ HKEY WINAPI SetupDiOpenClassRegKeyExW(
|
|||
PCWSTR MachineName OPTIONAL,
|
||||
PVOID Reserved)
|
||||
{
|
||||
LPWSTR lpGuidString;
|
||||
LPWSTR lpFullGuidString;
|
||||
LPWSTR lpGuidString = NULL;
|
||||
LPWSTR lpFullGuidString = NULL;
|
||||
DWORD dwLength;
|
||||
HKEY HKLM;
|
||||
HKEY hClassesKey;
|
||||
HKEY hClassKey;
|
||||
HKEY hClassesKey = NULL;
|
||||
HKEY hClassKey = NULL;
|
||||
HKEY ret = INVALID_HANDLE_VALUE;
|
||||
DWORD rc;
|
||||
LPCWSTR lpKeyName;
|
||||
|
||||
|
@ -3343,18 +3345,14 @@ HKEY WINAPI SetupDiOpenClassRegKeyExW(
|
|||
Flags, debugstr_w(MachineName), Reserved);
|
||||
|
||||
if (Flags == DIOCR_INSTALLER)
|
||||
{
|
||||
lpKeyName = REGSTR_PATH_CLASS_NT;
|
||||
}
|
||||
else if (Flags == DIOCR_INTERFACE)
|
||||
{
|
||||
lpKeyName = REGSTR_PATH_DEVICE_CLASSES;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("Invalid Flags parameter!\n");
|
||||
SetLastError(ERROR_INVALID_FLAGS);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (MachineName != NULL)
|
||||
|
@ -3363,32 +3361,35 @@ HKEY WINAPI SetupDiOpenClassRegKeyExW(
|
|||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
else
|
||||
HKLM = HKEY_LOCAL_MACHINE;
|
||||
|
||||
rc = RegOpenKeyExW(HKLM,
|
||||
lpKeyName,
|
||||
0,
|
||||
ClassGuid ? 0 : samDesired,
|
||||
&hClassesKey);
|
||||
lpKeyName,
|
||||
0,
|
||||
ClassGuid ? 0 : samDesired,
|
||||
&hClassesKey);
|
||||
if (MachineName != NULL) RegCloseKey(HKLM);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (ClassGuid == NULL)
|
||||
return hClassesKey;
|
||||
{
|
||||
/* Stop here. We don't need to open a subkey */
|
||||
ret = hClassesKey;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (UuidToStringW((UUID*)ClassGuid, &lpGuidString) != RPC_S_OK)
|
||||
{
|
||||
SetLastError(ERROR_GEN_FAILURE);
|
||||
RegCloseKey(hClassesKey);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
SetLastError(ERROR_GEN_FAILURE);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
dwLength = lstrlenW(lpGuidString);
|
||||
|
@ -3396,32 +3397,36 @@ HKEY WINAPI SetupDiOpenClassRegKeyExW(
|
|||
if (!lpFullGuidString)
|
||||
{
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
RpcStringFreeW(&lpGuidString);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
goto cleanup;
|
||||
}
|
||||
lpFullGuidString[0] = '{';
|
||||
memcpy(&lpFullGuidString[1], lpGuidString, dwLength * sizeof(WCHAR));
|
||||
lpFullGuidString[dwLength + 1] = '}';
|
||||
lpFullGuidString[dwLength + 2] = '\0';
|
||||
RpcStringFreeW(&lpGuidString);
|
||||
|
||||
rc = RegOpenKeyExW(hClassesKey,
|
||||
lpFullGuidString,
|
||||
0,
|
||||
samDesired,
|
||||
&hClassKey);
|
||||
lpFullGuidString,
|
||||
0,
|
||||
samDesired,
|
||||
&hClassKey);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
SetLastError(rc);
|
||||
HeapFree(GetProcessHeap(), 0, lpFullGuidString);
|
||||
RegCloseKey(hClassesKey);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
SetLastError(rc);
|
||||
goto cleanup;
|
||||
}
|
||||
ret = hClassKey;
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, lpFullGuidString);
|
||||
RegCloseKey(hClassesKey);
|
||||
cleanup:
|
||||
if (hClassKey != NULL && hClassKey != ret)
|
||||
RegCloseKey(hClassesKey);
|
||||
if (hClassesKey != NULL && hClassesKey != ret)
|
||||
RegCloseKey(hClassesKey);
|
||||
if (lpGuidString)
|
||||
RpcStringFreeW(&lpGuidString);
|
||||
if (lpFullGuidString)
|
||||
HeapFree(GetProcessHeap(), 0, lpFullGuidString);
|
||||
|
||||
return hClassKey;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -3942,7 +3947,8 @@ BOOL WINAPI SetupDiCallClassInstaller(
|
|||
ListEntry = ClassCoInstallersListHead.Flink;
|
||||
while (rc == NO_ERROR && ListEntry != &ClassCoInstallersListHead)
|
||||
{
|
||||
struct CoInstallerElement *coinstaller = (struct CoInstallerElement *)ListEntry;
|
||||
struct CoInstallerElement *coinstaller;
|
||||
coinstaller = CONTAINING_RECORD(ListEntry, struct CoInstallerElement, ListEntry);
|
||||
rc = (*coinstaller->Function)(InstallFunction, DeviceInfoSet, DeviceInfoData, &Context);
|
||||
coinstaller->PrivateData = Context.PrivateData;
|
||||
if (rc == ERROR_DI_POSTPROCESSING_REQUIRED)
|
||||
|
@ -3957,7 +3963,8 @@ BOOL WINAPI SetupDiCallClassInstaller(
|
|||
ListEntry = DeviceCoInstallersListHead.Flink;
|
||||
while (rc == NO_ERROR && ListEntry != &DeviceCoInstallersListHead)
|
||||
{
|
||||
struct CoInstallerElement *coinstaller = (struct CoInstallerElement *)ListEntry;
|
||||
struct CoInstallerElement *coinstaller;
|
||||
coinstaller = CONTAINING_RECORD(ListEntry, struct CoInstallerElement, ListEntry);
|
||||
rc = (*coinstaller->Function)(InstallFunction, DeviceInfoSet, DeviceInfoData, &Context);
|
||||
coinstaller->PrivateData = Context.PrivateData;
|
||||
if (rc == ERROR_DI_POSTPROCESSING_REQUIRED)
|
||||
|
@ -3996,7 +4003,8 @@ BOOL WINAPI SetupDiCallClassInstaller(
|
|||
ListEntry = ClassCoInstallersListHead.Flink;
|
||||
while (ListEntry != &ClassCoInstallersListHead)
|
||||
{
|
||||
struct CoInstallerElement *coinstaller = (struct CoInstallerElement *)ListEntry;
|
||||
struct CoInstallerElement *coinstaller;
|
||||
coinstaller = CONTAINING_RECORD(ListEntry, struct CoInstallerElement, ListEntry);
|
||||
if (coinstaller->DoPostProcessing)
|
||||
{
|
||||
Context.InstallResult = rc;
|
||||
|
@ -4011,7 +4019,8 @@ BOOL WINAPI SetupDiCallClassInstaller(
|
|||
ListEntry = DeviceCoInstallersListHead.Flink;
|
||||
while (ListEntry != &DeviceCoInstallersListHead)
|
||||
{
|
||||
struct CoInstallerElement *coinstaller = (struct CoInstallerElement *)ListEntry;
|
||||
struct CoInstallerElement *coinstaller;
|
||||
coinstaller = CONTAINING_RECORD(ListEntry, struct CoInstallerElement, ListEntry);
|
||||
if (coinstaller->DoPostProcessing)
|
||||
{
|
||||
Context.InstallResult = rc;
|
||||
|
@ -6023,7 +6032,7 @@ SetupDiDestroyDriverInfoList(
|
|||
while (!IsListEmpty(&list->DriverListHead))
|
||||
{
|
||||
ListEntry = RemoveHeadList(&list->DriverListHead);
|
||||
driverInfo = (struct DriverInfoElement *)ListEntry;
|
||||
driverInfo = CONTAINING_RECORD(ListEntry, struct DriverInfoElement, ListEntry);
|
||||
DestroyDriverInfoElement(driverInfo);
|
||||
}
|
||||
InstallParams.Reserved = 0;
|
||||
|
@ -6043,7 +6052,7 @@ SetupDiDestroyDriverInfoList(
|
|||
while (!IsListEmpty(&deviceInfo->DriverListHead))
|
||||
{
|
||||
ListEntry = RemoveHeadList(&deviceInfo->DriverListHead);
|
||||
driverInfo = (struct DriverInfoElement *)ListEntry;
|
||||
driverInfo = CONTAINING_RECORD(ListEntry, struct DriverInfoElement, ListEntry);
|
||||
if ((PVOID)InstallParamsSet.Reserved == driverInfo)
|
||||
{
|
||||
InstallParamsSet.Reserved = 0;
|
||||
|
@ -6321,7 +6330,7 @@ SetupDiEnumDriverInfoW(
|
|||
SetLastError(ERROR_NO_MORE_ITEMS);
|
||||
else
|
||||
{
|
||||
struct DriverInfoElement *DrvInfo = (struct DriverInfoElement *)ItemList;
|
||||
struct DriverInfoElement *DrvInfo = CONTAINING_RECORD(ItemList, struct DriverInfoElement, ListEntry);
|
||||
|
||||
memcpy(
|
||||
&DriverInfoData->DriverType,
|
||||
|
@ -6653,11 +6662,11 @@ SetupDiSetSelectedDriverW(
|
|||
SetLastError(ERROR_INVALID_PARAMETER);
|
||||
else
|
||||
{
|
||||
*pDriverInfo = (struct DriverInfoElement *)ItemList;
|
||||
*pDriverInfo = CONTAINING_RECORD(ItemList, struct DriverInfoElement, ListEntry);
|
||||
DriverInfoData->Reserved = (ULONG_PTR)ItemList;
|
||||
ret = TRUE;
|
||||
TRACE("Choosing driver whose rank is 0x%lx\n",
|
||||
((struct DriverInfoElement *)ItemList)->DriverRank);
|
||||
(*pDriverInfo)->DriverRank);
|
||||
if (DeviceInfoData)
|
||||
memcpy(&DeviceInfoData->ClassGuid, &(*pDriverInfo)->ClassGuid, sizeof(GUID));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue