forked from Mirrors/wine-wine
ntoskrnl.exe: Support NULL type in ObReferenceObjectByHandle.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>stable
parent
f2a07b117a
commit
fdcd9ee712
|
@ -315,6 +315,18 @@ static void ObReferenceObject( void *obj )
|
||||||
TRACE( "(%p) ref=%u\n", obj, ref );
|
TRACE( "(%p) ref=%u\n", obj, ref );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const POBJECT_TYPE *known_types[] =
|
||||||
|
{
|
||||||
|
&ExEventObjectType,
|
||||||
|
&ExSemaphoreObjectType,
|
||||||
|
&IoDeviceObjectType,
|
||||||
|
&IoDriverObjectType,
|
||||||
|
&IoFileObjectType,
|
||||||
|
&PsProcessType,
|
||||||
|
&PsThreadType,
|
||||||
|
&SeTokenObjectType
|
||||||
|
};
|
||||||
|
|
||||||
static NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, void **ret )
|
static NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, void **ret )
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
@ -326,8 +338,24 @@ static NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, voi
|
||||||
status = NtQueryObject(handle, ObjectTypeInformation, buf, sizeof(buf), &size);
|
status = NtQueryObject(handle, ObjectTypeInformation, buf, sizeof(buf), &size);
|
||||||
if (status) return status;
|
if (status) return status;
|
||||||
|
|
||||||
if (!!RtlCompareUnicodeStrings(type->name, strlenW(type->name), type_info->TypeName.Buffer,
|
if (!type)
|
||||||
type_info->TypeName.Length / sizeof(WCHAR), FALSE))
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < ARRAY_SIZE(known_types); i++)
|
||||||
|
{
|
||||||
|
type = *known_types[i];
|
||||||
|
if (!RtlCompareUnicodeStrings( type->name, strlenW(type->name), type_info->TypeName.Buffer,
|
||||||
|
type_info->TypeName.Length / sizeof(WCHAR), FALSE ))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == ARRAY_SIZE(known_types))
|
||||||
|
{
|
||||||
|
FIXME("Unsupported type %s\n", debugstr_us(&type_info->TypeName));
|
||||||
|
return STATUS_INVALID_HANDLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!!RtlCompareUnicodeStrings( type->name, strlenW(type->name), type_info->TypeName.Buffer,
|
||||||
|
type_info->TypeName.Length / sizeof(WCHAR), FALSE ))
|
||||||
return STATUS_OBJECT_TYPE_MISMATCH;
|
return STATUS_OBJECT_TYPE_MISMATCH;
|
||||||
|
|
||||||
FIXME( "semi-stub: returning new %s object instance\n", debugstr_w(type->name) );
|
FIXME( "semi-stub: returning new %s object instance\n", debugstr_w(type->name) );
|
||||||
|
|
|
@ -27,6 +27,15 @@ struct _OBJECT_TYPE {
|
||||||
void (*release)(void*); /* called when the last reference is released */
|
void (*release)(void*); /* called when the last reference is released */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern POBJECT_TYPE ExEventObjectType;
|
||||||
|
extern POBJECT_TYPE ExSemaphoreObjectType;
|
||||||
|
extern POBJECT_TYPE IoDeviceObjectType;
|
||||||
|
extern POBJECT_TYPE IoDriverObjectType;
|
||||||
|
extern POBJECT_TYPE IoFileObjectType;
|
||||||
|
extern POBJECT_TYPE PsProcessType;
|
||||||
|
extern POBJECT_TYPE PsThreadType;
|
||||||
|
extern POBJECT_TYPE SeTokenObjectType;
|
||||||
|
|
||||||
|
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
#define DEFINE_FASTCALL1_WRAPPER(func) \
|
#define DEFINE_FASTCALL1_WRAPPER(func) \
|
||||||
|
|
|
@ -705,7 +705,7 @@ static void test_ob_reference(const WCHAR *test_path)
|
||||||
status = ObReferenceObjectByHandle(event_handle, SYNCHRONIZE, *pIoFileObjectType, KernelMode, &obj1, NULL);
|
status = ObReferenceObjectByHandle(event_handle, SYNCHRONIZE, *pIoFileObjectType, KernelMode, &obj1, NULL);
|
||||||
ok(status == STATUS_OBJECT_TYPE_MISMATCH, "ObReferenceObjectByHandle returned: %#x\n", status);
|
ok(status == STATUS_OBJECT_TYPE_MISMATCH, "ObReferenceObjectByHandle returned: %#x\n", status);
|
||||||
|
|
||||||
status = ObReferenceObjectByHandle(event_handle, SYNCHRONIZE, *pExEventObjectType, KernelMode, &obj1, NULL);
|
status = ObReferenceObjectByHandle(event_handle, SYNCHRONIZE, NULL, KernelMode, &obj1, NULL);
|
||||||
ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
|
ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
|
||||||
|
|
||||||
if (sizeof(void *) != 4) /* avoid dealing with fastcall */
|
if (sizeof(void *) != 4) /* avoid dealing with fastcall */
|
||||||
|
@ -722,9 +722,16 @@ static void test_ob_reference(const WCHAR *test_path)
|
||||||
todo_wine
|
todo_wine
|
||||||
ok(obj1 == obj2, "obj1 != obj2\n");
|
ok(obj1 == obj2, "obj1 != obj2\n");
|
||||||
|
|
||||||
ObDereferenceObject(obj1);
|
|
||||||
ObDereferenceObject(obj2);
|
ObDereferenceObject(obj2);
|
||||||
|
|
||||||
|
status = ObReferenceObjectByHandle(event_handle, SYNCHRONIZE, NULL, KernelMode, &obj2, NULL);
|
||||||
|
ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
|
||||||
|
todo_wine
|
||||||
|
ok(obj1 == obj2, "obj1 != obj2\n");
|
||||||
|
|
||||||
|
ObDereferenceObject(obj2);
|
||||||
|
ObDereferenceObject(obj1);
|
||||||
|
|
||||||
status = ObReferenceObjectByHandle(file_handle, SYNCHRONIZE, *pIoFileObjectType, KernelMode, &obj1, NULL);
|
status = ObReferenceObjectByHandle(file_handle, SYNCHRONIZE, *pIoFileObjectType, KernelMode, &obj1, NULL);
|
||||||
ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
|
ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue