ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

cmbwmi.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.