From 2698249362e7dce9426a948f55c921f931bb0dc4 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Tue, 2 Jul 2019 17:44:35 -0500 Subject: [PATCH] ntoskrnl.exe: Use the registered interface class in IoSetDeviceInterfaceState(). Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/ntoskrnl.exe/pnp.c | 77 +---------------------------------------- 1 file changed, 1 insertion(+), 76 deletions(-) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 4ec8aaaed27..30865a05dcb 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -71,77 +71,6 @@ static int interface_rb_compare( const void *key, const struct wine_rb_entry *en static struct wine_rb_tree device_interfaces = { interface_rb_compare }; -static inline BOOL is_valid_hex(WCHAR c) -{ - if (!(((c >= '0') && (c <= '9')) || - ((c >= 'a') && (c <= 'f')) || - ((c >= 'A') && (c <= 'F')))) - return FALSE; - return TRUE; -} - -static const BYTE guid_conv_table[256] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /* 0x30 */ - 0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */ - 0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf /* 0x60 */ -}; - -static BOOL guid_from_string(const WCHAR *s, GUID *id) -{ - int i; - - if (!s || s[0] != '{') - { - memset( id, 0, sizeof (CLSID) ); - return FALSE; - } - - id->Data1 = 0; - for (i = 1; i < 9; i++) - { - if (!is_valid_hex(s[i])) return FALSE; - id->Data1 = (id->Data1 << 4) | guid_conv_table[s[i]]; - } - if (s[9] != '-') return FALSE; - - id->Data2 = 0; - for (i = 10; i < 14; i++) - { - if (!is_valid_hex(s[i])) return FALSE; - id->Data2 = (id->Data2 << 4) | guid_conv_table[s[i]]; - } - if (s[14] != '-') return FALSE; - - id->Data3 = 0; - for (i = 15; i < 19; i++) - { - if (!is_valid_hex(s[i])) return FALSE; - id->Data3 = (id->Data3 << 4) | guid_conv_table[s[i]]; - } - if (s[19] != '-') return FALSE; - - for (i = 20; i < 37; i += 2) - { - if (i == 24) - { - if (s[i] != '-') return FALSE; - i++; - } - if (!is_valid_hex(s[i]) || !is_valid_hex(s[i+1])) return FALSE; - id->Data4[(i-20)/2] = guid_conv_table[s[i]] << 4 | guid_conv_table[s[i+1]]; - } - - if (s[37] == '}') - return TRUE; - - return FALSE; -} - static NTSTATUS WINAPI internal_complete( DEVICE_OBJECT *device, IRP *irp, void *context ) { HANDLE event = context; @@ -594,7 +523,6 @@ NTSTATUS WINAPI IoSetDeviceInterfaceState( UNICODE_STRING *name, BOOLEAN enable UNICODE_STRING string; DWORD data = enable; NTSTATUS ret; - GUID class; ULONG len; TRACE("device %s, enable %u.\n", debugstr_us(name), enable); @@ -615,9 +543,6 @@ NTSTATUS WINAPI IoSetDeviceInterfaceState( UNICODE_STRING *name, BOOLEAN enable if (*p == '\\') refstr = p; if (!refstr) refstr = p; - if (!guid_from_string( refstr - 38, &class )) - return STATUS_INVALID_PARAMETER; - len = lstrlenW(DeviceClassesW) + 38 + 1 + namelen + 2 + 1; if (!(path = heap_alloc( len * sizeof(WCHAR) ))) @@ -676,7 +601,7 @@ NTSTATUS WINAPI IoSetDeviceInterfaceState( UNICODE_STRING *name, BOOLEAN enable { broadcast->dbcc_size = len; broadcast->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; - broadcast->dbcc_classguid = class; + broadcast->dbcc_classguid = iface->interface_class; lstrcpynW( broadcast->dbcc_name, name->Buffer, namelen + 1 ); BroadcastSystemMessageW( BSF_FORCEIFHUNG | BSF_QUERY, NULL, WM_DEVICECHANGE, enable ? DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE, (LPARAM)broadcast );