Re: [PATCH v3 07/20] winebus.sys: Add Linux udev bus
+NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp) +{ + NTSTATUS rc = STATUS_NOT_SUPPORTED;
You generally want to initialize this with irp->IoStatus.Status. For requests the bus driver doesn't support, it needs to return whatever the drivers higher up the stack decided. E.g. IRP_MN_QUERY_DEVICE_RELATIONS might be handled by a bus driver FDO above, in which case it will likely set the status to success -- and lower-level drivers need to propagate this status unless they have specific reason to override it. This is the reason for the requirement to initialize IoStatus to STATUS_NOT_SUPPORTED when sending the IRP.
+ IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp); + + switch(irpsp->MinorFunction) + { + case IRP_MN_QUERY_DEVICE_RELATIONS: + TRACE("IRP_MN_QUERY_DEVICE_RELATIONS\n"); + break; + case IRP_MN_QUERY_ID: + { + TRACE("IRP_MN_QUERY_ID\n"); + break; + } + case IRP_MN_QUERY_CAPABILITIES: + TRACE("IRP_MN_QUERY_CAPABILITIES\n"); + break; + } + IoCompleteRequest( irp, IO_NO_INCREMENT ); + return rc; +} + +DWORD check_bus_disabled(UNICODE_STRING *registry_path) +{ + OBJECT_ATTRIBUTES attr; + HANDLE key; + DWORD disabled = 0; + static const WCHAR disabledW[] = {'D','i','s','a','b','l','e','d',0}; + static const UNICODE_STRING disabled_str = {sizeof(disabledW) - sizeof(WCHAR), sizeof(disabledW), (WCHAR*)disabledW}; + + InitializeObjectAttributes(&attr, registry_path, OBJ_CASE_INSENSITIVE, NULL, NULL);
This is another case for OBJ_KERNEL_HANDLE. You basically want this by default in kernel code, unless you specifically intend to pass this handle to an application.
+ if (ZwOpenKey(&key, KEY_ALL_ACCESS, &attr) == STATUS_SUCCESS) + { + DWORD size; + KEY_VALUE_PARTIAL_INFORMATION info; + + if (ZwQueryValueKey(key, &disabled_str, KeyValuePartialInformation, &info, sizeof(info), &size) == STATUS_SUCCESS)
Your 'info' structure isn't large enough to hold DWORD data, since the 'Data' member is a one byte array.
+ { + disabled = *(DWORD*)&info.Data; + } + + ZwClose(key); + } + + return disabled; +}
participants (1)
-
Thomas Faber