Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencmbwmi.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS ACPI-Compliant Control Method Battery 00003 * LICENSE: BSD - See COPYING.ARM in the top level directory 00004 * FILE: boot/drivers/bus/acpi/cmbatt/cmbwmi.c 00005 * PURPOSE: WMI Interface 00006 * PROGRAMMERS: ReactOS Portable Systems Group 00007 */ 00008 00009 /* INCLUDES *******************************************************************/ 00010 00011 #include "cmbatt.h" 00012 00013 /* GLOBALS ********************************************************************/ 00014 00015 WMIGUIDREGINFO CmBattWmiGuidList[1] = 00016 { 00017 {&GUID_POWER_DEVICE_WAKE_ENABLE, 1, 0} 00018 }; 00019 00020 /* FUNCTIONS ******************************************************************/ 00021 00022 PCHAR 00023 NTAPI 00024 WMIMinorFunctionString(IN UCHAR MinorFunction) 00025 { 00026 switch (MinorFunction) 00027 { 00028 case IRP_MN_CHANGE_SINGLE_INSTANCE: 00029 return "IRP_MN_CHANGE_SINGLE_INSTANCE"; 00030 case IRP_MN_CHANGE_SINGLE_ITEM: 00031 return "IRP_MN_CHANGE_SINGLE_ITEM"; 00032 case IRP_MN_DISABLE_COLLECTION: 00033 return "IRP_MN_DISABLE_COLLECTION"; 00034 case IRP_MN_DISABLE_EVENTS: 00035 return "IRP_MN_DISABLE_EVENTS"; 00036 case IRP_MN_ENABLE_COLLECTION: 00037 return "IRP_MN_ENABLE_COLLECTION"; 00038 case IRP_MN_ENABLE_EVENTS: 00039 return "IRP_MN_ENABLE_EVENTS"; 00040 case IRP_MN_EXECUTE_METHOD: 00041 return "IRP_MN_EXECUTE_METHOD"; 00042 case IRP_MN_QUERY_ALL_DATA: 00043 return "IRP_MN_QUERY_ALL_DATA"; 00044 case IRP_MN_QUERY_SINGLE_INSTANCE: 00045 return "IRP_MN_QUERY_SINGLE_INSTANCE"; 00046 case IRP_MN_REGINFO: 00047 return "IRP_MN_REGINFO"; 00048 default: 00049 return "IRP_MN_?????"; 00050 } 00051 } 00052 00053 NTSTATUS 00054 NTAPI 00055 CmBattQueryWmiRegInfo(PDEVICE_OBJECT DeviceObject, 00056 PULONG RegFlags, 00057 PUNICODE_STRING InstanceName, 00058 PUNICODE_STRING *RegistryPath, 00059 PUNICODE_STRING MofResourceName, 00060 PDEVICE_OBJECT *Pdo) 00061 { 00062 UNIMPLEMENTED; 00063 return STATUS_NOT_IMPLEMENTED; 00064 } 00065 00066 NTSTATUS 00067 NTAPI 00068 CmBattQueryWmiDataBlock(PDEVICE_OBJECT DeviceObject, 00069 PIRP Irp, 00070 ULONG GuidIndex, 00071 ULONG InstanceIndex, 00072 ULONG InstanceCount, 00073 PULONG InstanceLengthArray, 00074 ULONG BufferAvail, 00075 PUCHAR Buffer) 00076 { 00077 UNIMPLEMENTED; 00078 return STATUS_NOT_IMPLEMENTED; 00079 } 00080 00081 NTSTATUS 00082 NTAPI 00083 CmBattSetWmiDataBlock(PDEVICE_OBJECT DeviceObject, 00084 PIRP Irp, 00085 ULONG GuidIndex, 00086 ULONG InstanceIndex, 00087 ULONG BufferSize, 00088 PUCHAR Buffer) 00089 { 00090 UNIMPLEMENTED; 00091 return STATUS_NOT_IMPLEMENTED; 00092 } 00093 00094 NTSTATUS 00095 NTAPI 00096 CmBattSetWmiDataItem(PDEVICE_OBJECT DeviceObject, 00097 PIRP Irp, 00098 ULONG GuidIndex, 00099 ULONG InstanceIndex, 00100 ULONG DataItemId, 00101 ULONG BufferSize, 00102 PUCHAR Buffer) 00103 { 00104 UNIMPLEMENTED; 00105 return STATUS_NOT_IMPLEMENTED; 00106 } 00107 00108 NTSTATUS 00109 NTAPI 00110 CmBattWmiDeRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension) 00111 { 00112 PAGED_CODE(); 00113 00114 /* De-register */ 00115 return IoWMIRegistrationControl(DeviceExtension->FdoDeviceObject, 00116 WMIREG_ACTION_DEREGISTER); 00117 } 00118 00119 NTSTATUS 00120 NTAPI 00121 CmBattWmiRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension) 00122 { 00123 PAGED_CODE(); 00124 00125 /* GUID information */ 00126 DeviceExtension->WmiLibInfo.GuidCount = sizeof(CmBattWmiGuidList) / 00127 sizeof(WMIGUIDREGINFO); 00128 DeviceExtension->WmiLibInfo.GuidList = CmBattWmiGuidList; 00129 00130 /* Callbacks */ 00131 DeviceExtension->WmiLibInfo.QueryWmiRegInfo = CmBattQueryWmiRegInfo; 00132 DeviceExtension->WmiLibInfo.QueryWmiDataBlock = CmBattQueryWmiDataBlock; 00133 DeviceExtension->WmiLibInfo.SetWmiDataBlock = CmBattSetWmiDataBlock; 00134 DeviceExtension->WmiLibInfo.SetWmiDataItem = CmBattSetWmiDataItem; 00135 DeviceExtension->WmiLibInfo.ExecuteWmiMethod = NULL; 00136 DeviceExtension->WmiLibInfo.WmiFunctionControl = NULL; 00137 00138 /* Register */ 00139 return IoWMIRegistrationControl(DeviceExtension->FdoDeviceObject, 00140 WMIREG_ACTION_REGISTER); 00141 } 00142 00143 NTSTATUS 00144 NTAPI 00145 CmBattSystemControl(IN PDEVICE_OBJECT DeviceObject, 00146 IN PIRP Irp) 00147 { 00148 NTSTATUS Status; 00149 PCMBATT_DEVICE_EXTENSION DeviceExtension; 00150 PWMILIB_CONTEXT WmiLibContext; 00151 SYSCTL_IRP_DISPOSITION Disposition = IrpForward; 00152 PAGED_CODE(); 00153 if (CmBattDebug & 2) 00154 DbgPrint("CmBatt: SystemControl: %s\n", 00155 WMIMinorFunctionString(IoGetCurrentIrpStackLocation(Irp)->MinorFunction)); 00156 00157 /* Acquire the remove lock */ 00158 DeviceExtension = DeviceObject->DeviceExtension; 00159 Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, 0); 00160 if (!NT_SUCCESS(Status)) 00161 { 00162 /* It's too late, fail */ 00163 Irp->IoStatus.Status = STATUS_DEVICE_REMOVED; 00164 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00165 return STATUS_DEVICE_REMOVED; 00166 } 00167 00168 /* What kind of device is this? */ 00169 WmiLibContext = &DeviceExtension->WmiLibInfo; 00170 if (DeviceExtension->FdoType == CmBattBattery) 00171 { 00172 /* For batteries, let the class driver handle it */ 00173 Status = BatteryClassSystemControl(DeviceExtension->ClassData, 00174 WmiLibContext, 00175 DeviceObject, 00176 Irp, 00177 &Disposition); 00178 } 00179 else 00180 { 00181 /* Otherwise, call the wmi library directly */ 00182 Status = WmiSystemControl(WmiLibContext, 00183 DeviceObject, 00184 Irp, 00185 &Disposition); 00186 } 00187 00188 /* Check what happened */ 00189 switch (Disposition) 00190 { 00191 case IrpNotCompleted: 00192 00193 /* Complete it here */ 00194 if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Not Completed.\n"); 00195 IoCompleteRequest(Irp, IO_NO_INCREMENT); 00196 break; 00197 00198 case IrpForward: 00199 00200 /* Forward it to ACPI */ 00201 if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Forward.\n"); 00202 IoSkipCurrentIrpStackLocation(Irp); 00203 Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp); 00204 break; 00205 00206 case IrpProcessed: 00207 00208 /* Nothing to do */ 00209 if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Processed.\n"); 00210 break; 00211 00212 default: 00213 ASSERT(FALSE); 00214 } 00215 00216 /* Release the lock and return */ 00217 IoReleaseRemoveLock(&DeviceExtension->RemoveLock, 0); 00218 return Status; 00219 } 00220 00221 /* EOF */ Generated on Sat May 26 2012 04:25:59 for ReactOS by
1.7.6.1
|