ntoskrnl.exe: Implement IoSetDeviceInterfaceState().

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
Zebediah Figura 2018-08-16 18:37:37 -05:00 committed by Alexandre Julliard
parent 754ee56644
commit ad6845b4af
3 changed files with 70 additions and 2 deletions

View File

@ -43,7 +43,7 @@
#include "wine/unicode.h"
#include "wine/server.h"
#include "wine/debug.h"
#include "wine/heap.h"
#include "wine/rbtree.h"
WINE_DEFAULT_DEBUG_CHANNEL(ntoskrnl);
@ -1192,6 +1192,73 @@ NTSTATUS WINAPI IoDeleteSymbolicLink( UNICODE_STRING *name )
}
/***********************************************************************
* IoSetDeviceInterfaceState (NTOSKRNL.EXE.@)
*/
NTSTATUS WINAPI IoSetDeviceInterfaceState( UNICODE_STRING *name, BOOLEAN enable )
{
const WCHAR DeviceClassesW[] = {'\\','R','E','G','I','S','T','R','Y','\\',
'M','a','c','h','i','n','e','\\','S','y','s','t','e','m','\\',
'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
'C','o','n','t','r','o','l','\\',
'D','e','v','i','c','e','C','l','a','s','s','e','s','\\',0};
const WCHAR controlW[] = {'C','o','n','t','r','o','l',0};
const WCHAR linkedW[] = {'L','i','n','k','e','d',0};
const WCHAR slashW[] = {'\\',0};
const WCHAR hashW[] = {'#',0};
size_t namelen = name->Length / sizeof(WCHAR);
HANDLE iface_key, control_key;
OBJECT_ATTRIBUTES attr = {0};
WCHAR *path, *refstr, *p;
UNICODE_STRING string;
NTSTATUS ret;
size_t len;
TRACE("(%s, %d)\n", debugstr_us(name), enable);
refstr = memrchrW(name->Buffer + 4, '\\', namelen - 4);
len = strlenW(DeviceClassesW) + 38 + 1 + namelen + 2;
if (!(path = heap_alloc( len * sizeof(WCHAR) )))
return STATUS_NO_MEMORY;
strcpyW( path, DeviceClassesW );
lstrcpynW( path + strlenW( path ), (refstr ? refstr : name->Buffer + namelen) - 38, 39 );
strcatW( path, slashW );
p = path + strlenW( path );
lstrcpynW( path + strlenW( path ), name->Buffer, (refstr ? (refstr - name->Buffer) : namelen) + 1 );
p[0] = p[1] = p[3] = '#';
strcatW( path, slashW );
strcatW( path, hashW );
if (refstr)
lstrcpynW( path + strlenW( path ), refstr, name->Buffer + namelen - refstr + 1 );
attr.Length = sizeof(attr);
attr.ObjectName = &string;
RtlInitUnicodeString( &string, path );
ret = NtOpenKey( &iface_key, KEY_CREATE_SUB_KEY, &attr );
if (!ret)
{
attr.RootDirectory = iface_key;
RtlInitUnicodeString( &string, controlW );
ret = NtCreateKey( &control_key, KEY_SET_VALUE, &attr, 0, NULL, 0, NULL );
if (!ret)
{
DWORD data = enable;
RtlInitUnicodeString( &string, linkedW );
ret = NtSetValueKey( control_key, &string, 0, REG_DWORD, &data, sizeof(data) );
NtClose( control_key );
}
NtClose( iface_key );
}
heap_free( path );
return ret;
}
/***********************************************************************
* IoGetDeviceInterfaces (NTOSKRNL.EXE.@)
*/

View File

@ -449,7 +449,7 @@
@ stub IoRequestDeviceEject
@ stub IoReuseIrp
@ stub IoSetCompletionRoutineEx
@ stub IoSetDeviceInterfaceState
@ stdcall IoSetDeviceInterfaceState(ptr long)
@ stub IoSetDeviceToVerify
@ stub IoSetFileOrigin
@ stub IoSetHardErrorOrVerifyDevice

View File

@ -1405,6 +1405,7 @@ void WINAPI IoInitializeIrp(IRP*,USHORT,CCHAR);
VOID WINAPI IoInitializeRemoveLockEx(PIO_REMOVE_LOCK,ULONG,ULONG,ULONG,ULONG);
void WINAPI IoInvalidateDeviceRelations(PDEVICE_OBJECT,DEVICE_RELATION_TYPE);
void WINAPI IoReleaseCancelSpinLock(KIRQL);
NTSTATUS WINAPI IoSetDeviceInterfaceState(UNICODE_STRING*,BOOLEAN);
NTSTATUS WINAPI IoWMIRegistrationControl(PDEVICE_OBJECT,ULONG);
PKTHREAD WINAPI KeGetCurrentThread(void);