[NTOS:IO]

- Pass Enum subkey handle to IopAttachFilterDrivers, since we've already opened it in PipCallDriverAddDevice.
CORE-13336

svn path=/trunk/; revision=75046
This commit is contained in:
Thomas Faber 2017-06-15 13:25:26 +00:00
parent 3dda28e8fb
commit 2103cf341f
2 changed files with 10 additions and 39 deletions

View file

@ -640,42 +640,16 @@ NTSTATUS
FASTCALL FASTCALL
IopAttachFilterDrivers( IopAttachFilterDrivers(
PDEVICE_NODE DeviceNode, PDEVICE_NODE DeviceNode,
HANDLE EnumSubKey,
BOOLEAN Lower) BOOLEAN Lower)
{ {
RTL_QUERY_REGISTRY_TABLE QueryTable[2] = { { NULL, 0, NULL, NULL, 0, NULL, 0 }, }; RTL_QUERY_REGISTRY_TABLE QueryTable[2] = { { NULL, 0, NULL, NULL, 0, NULL, 0 }, };
UNICODE_STRING Class; UNICODE_STRING Class;
WCHAR ClassBuffer[40]; WCHAR ClassBuffer[40];
UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT);
UNICODE_STRING ControlClass = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class"); UNICODE_STRING ControlClass = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class");
HANDLE EnumRootKey, SubKey;
HANDLE ControlKey, ClassKey; HANDLE ControlKey, ClassKey;
NTSTATUS Status; NTSTATUS Status;
/* Open enumeration root key */
Status = IopOpenRegistryKeyEx(&EnumRootKey,
NULL,
&EnumRoot,
KEY_READ);
if (!NT_SUCCESS(Status))
{
DPRINT1("IopOpenRegistryKeyEx() failed for '%wZ' with status 0x%lx\n",
&EnumRoot, Status);
return Status;
}
/* Open subkey */
Status = IopOpenRegistryKeyEx(&SubKey,
EnumRootKey,
&DeviceNode->InstancePath,
KEY_READ);
ZwClose(EnumRootKey);
if (!NT_SUCCESS(Status))
{
DPRINT1("IopOpenRegistryKeyEx() failed for '%wZ' with status 0x%lx\n",
&DeviceNode->InstancePath, Status);
return Status;
}
/* /*
* First load the device filters * First load the device filters
*/ */
@ -688,7 +662,7 @@ IopAttachFilterDrivers(
QueryTable[0].DefaultType = REG_NONE; QueryTable[0].DefaultType = REG_NONE;
Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
(PWSTR)SubKey, (PWSTR)EnumSubKey,
QueryTable, QueryTable,
DeviceNode, DeviceNode,
NULL); NULL);
@ -696,7 +670,6 @@ IopAttachFilterDrivers(
{ {
DPRINT1("Failed to load device %s filters: %08X\n", DPRINT1("Failed to load device %s filters: %08X\n",
Lower ? "lower" : "upper", Status); Lower ? "lower" : "upper", Status);
ZwClose(SubKey);
return Status; return Status;
} }
@ -712,14 +685,11 @@ IopAttachFilterDrivers(
QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT; QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT;
Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
(PWSTR)SubKey, (PWSTR)EnumSubKey,
QueryTable, QueryTable,
DeviceNode, DeviceNode,
NULL); NULL);
/* Close subkey */
ZwClose(SubKey);
/* If there is no class GUID, we're done */ /* If there is no class GUID, we're done */
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {

View file

@ -290,7 +290,6 @@ PipCallDriverAddDevice(IN PDEVICE_NODE DeviceNode,
Status = IopGetRegistryValue(SubKey, Status = IopGetRegistryValue(SubKey,
REGSTR_VAL_CLASSGUID, REGSTR_VAL_CLASSGUID,
&KeyValueInformation); &KeyValueInformation);
ZwClose(SubKey);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
/* Convert to unicode string */ /* Convert to unicode string */
@ -356,26 +355,28 @@ PipCallDriverAddDevice(IN PDEVICE_NODE DeviceNode,
} }
/* Do ReactOS-style setup */ /* Do ReactOS-style setup */
Status = IopAttachFilterDrivers(DeviceNode, TRUE); Status = IopAttachFilterDrivers(DeviceNode, SubKey, TRUE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
IopRemoveDevice(DeviceNode); IopRemoveDevice(DeviceNode);
return Status; goto Exit;
} }
Status = IopInitializeDevice(DeviceNode, DriverObject); Status = IopInitializeDevice(DeviceNode, DriverObject);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
Status = IopAttachFilterDrivers(DeviceNode, FALSE); Status = IopAttachFilterDrivers(DeviceNode, SubKey, FALSE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
IopRemoveDevice(DeviceNode); IopRemoveDevice(DeviceNode);
return Status; goto Exit;
} }
Status = IopStartDevice(DeviceNode); Status = IopStartDevice(DeviceNode);
} }
/* Return status */ Exit:
/* Close key and return status */
ZwClose(SubKey);
return Status; return Status;
} }