[PATCH v4] ntoskrnl.exe: Implement ObReferenceObjectByName for created drivers

Sebastian Lackner sebastian at fds-team.de
Thu Aug 4 11:49:28 CDT 2016


On 04.08.2016 18:24, Aric Stewart wrote:
> v2: Suggestions from Sebastian Lackner
> v3: eliminate duplicated driver_name
> v4: use the rb_tree
> 
> Signed-off-by: Aric Stewart <aric at codeweavers.com>
> ---
>  dlls/ntoskrnl.exe/ntoskrnl.c | 30 ++++++++++++++++++++++++++++--
>  1 file changed, 28 insertions(+), 2 deletions(-)
> 
> 
> 
> 0001-ntoskrnl.exe-Implement-ObReferenceObjectByName-but-onl.txt
> 
> 
> diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
> index 25187d3..883e845 100644
> --- a/dlls/ntoskrnl.exe/ntoskrnl.c
> +++ b/dlls/ntoskrnl.exe/ntoskrnl.c
> @@ -2107,8 +2107,34 @@ NTSTATUS WINAPI ObReferenceObjectByName( UNICODE_STRING *ObjectName,
>                                           void *ParseContext,
>                                           void **Object)
>  {
> -    FIXME("stub\n");
> -    return STATUS_NOT_IMPLEMENTED;
> +    struct wine_driver *driver;
> +    struct wine_rb_entry *entry;
> +
> +    TRACE("mostly-stub:%s %i %p %i %p %i %p %p\n", debugstr_us(ObjectName),
> +        Attributes, AccessState, DesiredAccess, ObjectType, AccessMode,
> +        ParseContext, Object);
> +
> +    if (AccessState) FIXME("Unhandled AccessState\n");
> +    if (DesiredAccess) FIXME("Unhandled DesiredAccess\n");
> +    if (ParseContext) FIXME("Unhandled ParseContext\n");
> +    if (ObjectType) FIXME("Unhandled ObjectType\n");
> +
> +    if (AccessMode != KernelMode)
> +    {
> +        FIXME("UserMode access not implemented\n");
> +        return STATUS_NOT_IMPLEMENTED;
> +    }
> +
> +    entry = wine_rb_get(&wine_drivers, ObjectName);

You will have to lock the CS before accessing the tree structure.

> +    if (!entry)
> +    {
> +        FIXME("Object not found, may not be tracked.\n");

For debugging purposes it would make sense to dump the name here.

> +        return STATUS_NOT_IMPLEMENTED;
> +    }
> +
> +    driver = WINE_RB_ENTRY_VALUE(entry, struct wine_driver, entry);
> +    *Object = &driver->driver_obj;
> +    return STATUS_SUCCESS;
>  }
>  
>  
> 
> 
> 




More information about the wine-devel mailing list