ntoskrnl.exe: Support NULL type in ObReferenceObjectByHandle.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
f2a07b117a
commit
fdcd9ee712
|
@ -315,6 +315,18 @@ static void ObReferenceObject( void *obj )
|
|||
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 )
|
||||
{
|
||||
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);
|
||||
if (status) return status;
|
||||
|
||||
if (!!RtlCompareUnicodeStrings(type->name, strlenW(type->name), type_info->TypeName.Buffer,
|
||||
type_info->TypeName.Length / sizeof(WCHAR), FALSE))
|
||||
if (!type)
|
||||
{
|
||||
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;
|
||||
|
||||
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 */
|
||||
};
|
||||
|
||||
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__
|
||||
#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);
|
||||
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);
|
||||
|
||||
if (sizeof(void *) != 4) /* avoid dealing with fastcall */
|
||||
|
@ -722,9 +722,16 @@ static void test_ob_reference(const WCHAR *test_path)
|
|||
todo_wine
|
||||
ok(obj1 == obj2, "obj1 != obj2\n");
|
||||
|
||||
ObDereferenceObject(obj1);
|
||||
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);
|
||||
ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
|
||||
|
||||
|
|
Loading…
Reference in New Issue