Reactos
1/*
2 * PROJECT: ReactOS Composite Battery Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Miscellaneous Support Routines
5 * COPYRIGHT: Copyright 2010 ReactOS Portable Systems Group <ros.arm@reactos.org>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "compbatt.h"
11
12/* FUNCTIONS ******************************************************************/
13
14NTSTATUS
15NTAPI
16BatteryIoctl(
17 _In_ ULONG IoControlCode,
18 _In_ PDEVICE_OBJECT DeviceObject,
19 _In_ PVOID InputBuffer,
20 _In_ ULONG InputBufferLength,
21 _Out_ PVOID OutputBuffer,
22 _Inout_ ULONG OutputBufferLength,
23 _In_ BOOLEAN InternalDeviceIoControl)
24{
25 IO_STATUS_BLOCK IoStatusBlock;
26 KEVENT Event;
27 NTSTATUS Status;
28 PIRP Irp;
29 PAGED_CODE();
30 if (CompBattDebug & COMPBATT_DEBUG_TRACE) DbgPrint("CompBatt: ENTERING BatteryIoctl\n");
31
32 /* Initialize the event and IRP */
33 KeInitializeEvent(&Event, SynchronizationEvent, 0);
34 Irp = IoBuildDeviceIoControlRequest(IoControlCode,
35 DeviceObject,
36 InputBuffer,
37 InputBufferLength,
38 OutputBuffer,
39 OutputBufferLength,
40 InternalDeviceIoControl,
41 &Event,
42 &IoStatusBlock);
43 if (Irp)
44 {
45 /* Call the class driver miniport */
46 Status = IoCallDriver(DeviceObject, Irp);
47 if (Status == STATUS_PENDING)
48 {
49 /* Wait for result */
50 KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
51 Status = IoStatusBlock.Status;
52 }
53
54 /* Print failure */
55 if (!(NT_SUCCESS(Status)) && (CompBattDebug & COMPBATT_DEBUG_ERR))
56 DbgPrint("BatteryIoctl: Irp failed - %x\n", Status);
57
58 /* Done */
59 if (CompBattDebug & COMPBATT_DEBUG_TRACE) DbgPrint("CompBatt: EXITING BatteryIoctl\n");
60 }
61 else
62 {
63 /* Out of memory */
64 if (CompBattDebug & COMPBATT_DEBUG_ERR) DbgPrint("BatteryIoctl: couldn't create Irp\n");
65 Status = STATUS_INSUFFICIENT_RESOURCES;
66 }
67
68 /* Return status */
69 return Status;
70}
71
72NTSTATUS
73NTAPI
74CompBattGetDeviceObjectPointer(
75 _In_ PUNICODE_STRING DeviceName,
76 _In_ ACCESS_MASK DesiredAccess,
77 _Out_ PFILE_OBJECT *FileObject,
78 _Out_ PDEVICE_OBJECT *DeviceObject)
79{
80 NTSTATUS Status;
81 OBJECT_ATTRIBUTES ObjectAttributes;
82 IO_STATUS_BLOCK IoStatusBlock;
83 PFILE_OBJECT LocalFileObject;
84 HANDLE DeviceHandle;
85 PAGED_CODE();
86
87 /* Open a file object handle to the device */
88 InitializeObjectAttributes(&ObjectAttributes,
89 DeviceName,
90 OBJ_KERNEL_HANDLE,
91 NULL,
92 NULL);
93 Status = ZwCreateFile(&DeviceHandle,
94 DesiredAccess,
95 &ObjectAttributes,
96 &IoStatusBlock,
97 NULL,
98 0,
99 FILE_SHARE_READ | FILE_SHARE_WRITE,
100 FILE_OPEN,
101 0,
102 NULL,
103 0);
104 if (NT_SUCCESS(Status))
105 {
106 /* Reference the file object */
107 Status = ObReferenceObjectByHandle(DeviceHandle,
108 0,
109 *IoFileObjectType,
110 KernelMode,
111 (PVOID)&LocalFileObject,
112 NULL);
113 if (NT_SUCCESS(Status))
114 {
115 /* Return the FO and the associated DO */
116 *FileObject = LocalFileObject;
117 *DeviceObject = IoGetRelatedDeviceObject(LocalFileObject);
118 }
119
120 /* Close the handle */
121 ZwClose(DeviceHandle);
122 }
123
124 /* Return status */
125 return Status;
126}
127
128/* EOF */