diff --git a/reactos/drivers/bus/acpi/compbatt/compbatt.h b/reactos/drivers/bus/acpi/compbatt/compbatt.h index 996b5559690..87e3cb11cf4 100644 --- a/reactos/drivers/bus/acpi/compbatt/compbatt.h +++ b/reactos/drivers/bus/acpi/compbatt/compbatt.h @@ -132,7 +132,7 @@ CompBattMonitorIrpCompleteWorker( NTSTATUS NTAPI CompBattGetDeviceObjectPointer( - IN PCUNICODE_STRING DeviceName, + IN PUNICODE_STRING DeviceName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject diff --git a/reactos/drivers/bus/acpi/compbatt/compmisc.c b/reactos/drivers/bus/acpi/compbatt/compmisc.c index 3f75d4b9abf..ced7e4195a2 100644 --- a/reactos/drivers/bus/acpi/compbatt/compmisc.c +++ b/reactos/drivers/bus/acpi/compbatt/compmisc.c @@ -22,19 +22,102 @@ BatteryIoctl(IN ULONG IoControlCode, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + IO_STATUS_BLOCK IoStatusBlock; + KEVENT Event; + NTSTATUS Status; + PIRP Irp; + PAGED_CODE(); + if (CompBattDebug & 0x100) DbgPrint("CompBatt: ENTERING BatteryIoctl\n"); + + /* Initialize the event and IRP */ + KeInitializeEvent(&Event, SynchronizationEvent, 0); + Irp = IoBuildDeviceIoControlRequest(IoControlCode, + DeviceObject, + InputBuffer, + InputBufferLength, + OutputBuffer, + OutputBufferLength, + InternalDeviceIoControl, + &Event, + &IoStatusBlock); + if (Irp) + { + /* Call the class driver miniport */ + Status = IofCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + /* Wait for result */ + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatusBlock.Status; + } + + /* Print failure */ + if (!(NT_SUCCESS(Status)) && (CompBattDebug & 8)) + DbgPrint("BatteryIoctl: Irp failed - %x\n", Status); + + /* Done */ + if (CompBattDebug & 0x100) DbgPrint("CompBatt: EXITING BatteryIoctl\n"); + } + else + { + /* Out of memory */ + if (CompBattDebug & 8) DbgPrint("BatteryIoctl: couldn't create Irp\n"); + Status = STATUS_INSUFFICIENT_RESOURCES; + } + + /* Return status */ + return Status; } NTSTATUS NTAPI -CompBattGetDeviceObjectPointer(IN PCUNICODE_STRING DeviceName, +CompBattGetDeviceObjectPointer(IN PUNICODE_STRING DeviceName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + PFILE_OBJECT LocalFileObject; + HANDLE DeviceHandle; + PAGED_CODE(); + + /* Open a file object handle to the device */ + InitializeObjectAttributes(&ObjectAttributes, DeviceName, 0, NULL, NULL); + Status = ZwCreateFile(&DeviceHandle, + DesiredAccess, + &ObjectAttributes, + &IoStatusBlock, + NULL, + 0, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL, + 0); + if (NT_SUCCESS(Status)) + { + /* Reference the file object */ + Status = ObReferenceObjectByHandle(DeviceHandle, + 0, + IoFileObjectType, + KernelMode, + (PVOID)&LocalFileObject, + NULL); + if (NT_SUCCESS(Status)) + { + /* Return the FO and the associated DO */ + *FileObject = LocalFileObject; + *DeviceObject = IoGetRelatedDeviceObject(LocalFileObject); + } + + /* Close the handle */ + ZwClose(DeviceHandle); + } + + /* Return status */ + return Status; } /* EOF */ diff --git a/reactos/drivers/bus/acpi/compbatt/comppnp.c b/reactos/drivers/bus/acpi/compbatt/comppnp.c index b9dd70ccc29..f09ed5c25bb 100644 --- a/reactos/drivers/bus/acpi/compbatt/comppnp.c +++ b/reactos/drivers/bus/acpi/compbatt/comppnp.c @@ -102,7 +102,7 @@ IsBatteryAlreadyOnList(IN PCUNICODE_STRING BatteryName, NTSTATUS NTAPI -CompBattAddNewBattery(IN PCUNICODE_STRING BatteryName, +CompBattAddNewBattery(IN PUNICODE_STRING BatteryName, IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension) { NTSTATUS Status = STATUS_SUCCESS;