Advertisement
Guest User

vfwmi.с Source Code

a guest
Feb 17th, 2017
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.23 KB | None | 0 0
  1. /*++
  2.  
  3. Copyright (c) none
  4.  
  5.  
  6. Module Name:
  7.  
  8.     vfwmi.с
  9.  
  10. Abstract:
  11.  
  12.     This module contains verifying System Control IRPs are handled correctly.
  13.  
  14. --*/
  15.  
  16. #include "vfdef.h"
  17.  
  18. #ifdef ALLOC_PRAGMA
  19. #pragma alloc_text(INIT, VfWmiInit)
  20. #pragma alloc_text(PAGEVRFY, VfWmiVerifyNewRequest)
  21. #pragma alloc_text(PAGEVRFY, VfWmiVerifyIrpStackDownward)
  22. #pragma alloc_text(PAGEVRFY, VfWmiVerifyIrpStackUpward)
  23. #pragma alloc_text(PAGEVRFY, VfWmiDumpIrpStack)
  24. #pragma alloc_text(PAGEVRFY, VfWmiTestStartedPdoStack)
  25. #endif
  26.  
  27. #ifdef ALLOC_DATA_PRAGMA
  28. #pragma data_seg("PAGEVRFC")
  29. #pragma const_seg("PAGEVRFC")
  30. #endif
  31.  
  32. VOID
  33. VfWmiInit(
  34.     VOID
  35.     )
  36. {
  37.     VfMajorRegisterHandlers(
  38.         IRP_MJ_SYSTEM_CONTROL,
  39.         VfWmiDumpIrpStack,
  40.         VfWmiVerifyNewRequest,
  41.         VfWmiVerifyIrpStackDownward,
  42.         VfWmiVerifyIrpStackUpward,
  43.         NULL,
  44.         NULL,
  45.         NULL,
  46.         NULL,
  47.         NULL,
  48.         NULL,
  49.         VfWmiTestStartedPdoStack,
  50.         NULL
  51.         );
  52. }
  53.  
  54. VOID
  55. FASTCALL
  56. VfWmiVerifyNewRequest(
  57.     IN PIOV_REQUEST_PACKET  IovPacket,
  58.     IN PDEVICE_OBJECT       DeviceObject,
  59.     IN PIO_STACK_LOCATION   IrpLastSp           OPTIONAL,
  60.     IN PIO_STACK_LOCATION   IrpSp,
  61.     IN PIOV_STACK_LOCATION  StackLocationData,
  62.     IN PVOID                CallerAddress       OPTIONAL
  63.     )
  64. {
  65.     NTSTATUS status;
  66.  
  67.     status = IovPacket->TrackedIrp->IoStatus.Status;
  68.     if ( status != STATUS_NOT_SUPPORTED )
  69.     {
  70.         WDM_FAIL_ROUTINE((
  71.             DCERROR_WMI_IRP_BAD_INITIAL_STATUS,
  72.             DCPARAM_IRP + DCPARAM_ROUTINE,
  73.             CallerAddress,
  74.             &IovPacket->TrackedIrp->Type
  75.             ));
  76.  
  77.         if ( status < STATUS_SUCCESS )
  78.         {
  79.             StackLocationData->Flags |= STACKFLAG_FAILURE_FORWARDED;
  80.         }
  81.     }
  82. }
  83.  
  84. VOID
  85. FASTCALL
  86. VfWmiVerifyIrpStackDownward(
  87.     IN PIOV_REQUEST_PACKET  IovPacket,
  88.     IN PDEVICE_OBJECT       DeviceObject,
  89.     IN PIO_STACK_LOCATION   IrpLastSp                   OPTIONAL,
  90.     IN PIO_STACK_LOCATION   IrpSp,
  91.     IN PIOV_STACK_LOCATION  RequestHeadLocationData,
  92.     IN PIOV_STACK_LOCATION  StackLocationData,
  93.     IN PVOID                CallerAddress               OPTIONAL
  94.     )
  95. {
  96.     PIRP Irp;
  97.     PDRIVER_OBJECT DriverObject;
  98.  
  99. //    PIOV_REQUEST_PACKET headPacket;
  100. //    headPacket = IovPacket->HeadPacket;
  101. //    ASSERT((headPacket->pIovSessionData == NULL)|| (IovPacket->Flags&TRACKFLAG_ACTIVE));
  102.  
  103.     Irp = IovPacket->TrackedIrp;
  104.     if ( VfPacketGetCurrentSessionData(IovPacket)->ForwardMethod == SKIPPED_A_DO && IovpInitCalled )
  105.     {
  106.         VfBugcheckThrowIoException(
  107.             DCERROR_SKIPPED_DEVICE_OBJECT,
  108.             DCPARAM_IRP + DCPARAM_ROUTINE,
  109.             CallerAddress,
  110.             Irp
  111.             );
  112.     }
  113.  
  114.     DriverObject = DeviceObject->DriverObject;
  115.     if ( !IovUtilHasDispatchHandler(DriverObject, IRP_MJ_SYSTEM_CONTROL) )
  116.     {
  117.         RequestHeadLocationData->Flags |= STACKFLAG_BOGUS_IRP_TOUCHED;
  118.         WDM_FAIL_ROUTINE((
  119.             DCERROR_MISSING_DISPATCH_FUNCTION,
  120.             DCPARAM_IRP + DCPARAM_ROUTINE,
  121.             DriverObject->DriverInit,
  122.             Irp
  123.             ));
  124.         StackLocationData->Flags |= STACKFLAG_NO_HANDLER;
  125.     }
  126. }
  127.  
  128. VOID
  129. FASTCALL
  130. VfWmiVerifyIrpStackUpward(
  131.     IN PIOV_REQUEST_PACKET  IovPacket,
  132.     IN PIO_STACK_LOCATION   IrpSp,
  133.     IN PIOV_STACK_LOCATION  RequestHeadLocationData,
  134.     IN PIOV_STACK_LOCATION  StackLocationData,
  135.     IN BOOLEAN              IsNewlyCompleted,
  136.     IN BOOLEAN              RequestFinalized
  137.     )
  138. {
  139.     PIRP Irp;
  140.     PVOID routine;
  141.  
  142.     Irp = IovPacket->TrackedIrp;
  143.     routine = StackLocationData->LastDispatch;
  144.  
  145.     ASSERT(routine);
  146.     if ( IsNewlyCompleted
  147.         && ~(StackLocationData->Flags >> 28) & ~(StackLocationData->Flags >> 31) & ((PDEVICE_OBJECT)IrpSp->Parameters.WMI.ProviderId != IrpSp->DeviceObject) & 1 )
  148.     {
  149.         if ( IovpInitCalled )
  150.         {
  151.             WDM_FAIL_ROUTINE((
  152.                 DCERROR_WMI_IRP_NOT_FORWARDED,
  153.                 DCPARAM_IRP + DCPARAM_ROUTINE + DCPARAM_DEVOBJ,
  154.                 routine,
  155.                 Irp
  156.             ));
  157.         }
  158.     }
  159. }
  160.  
  161. PCHAR WmiIrpNames[] = {
  162.     "IRP_MN_QUERY_ALL_DATA",                  // 0x00
  163.     "IRP_MN_QUERY_SINGLE_INSTANCE",           // 0x01
  164.     "IRP_MN_CHANGE_SINGLE_INSTANCE",          // 0x02
  165.     "IRP_MN_CHANGE_SINGLE_ITEM",              // 0x03
  166.     "IRP_MN_ENABLE_EVENTS",                   // 0x04
  167.     "IRP_MN_DISABLE_EVENTS",                  // 0x05
  168.     "IRP_MN_ENABLE_COLLECTION",               // 0x06
  169.     "IRP_MN_DISABLE_COLLECTION",              // 0x07
  170.     "IRP_MN_REGINFO",                         // 0x08
  171.     "IRP_MN_EXECUTE_METHOD",                  // 0x09
  172.     NULL
  173.     };
  174.  
  175. #define MAX_NAMED_WMI_IRP   0x9
  176.  
  177. VOID
  178. FASTCALL
  179. VfWmiDumpIrpStack(
  180.     IN PIO_STACK_LOCATION IrpSp
  181.     )
  182. {
  183.     DbgPrint("IRP_MJ_SYSTEM_CONTROL.");
  184.  
  185.     if ( IrpSp->MinorFunction <= MAX_NAMED_WMI_IRP )
  186.     {
  187.         DbgPrint(WmiIrpNames[IrpSp->MinorFunction]);
  188.     }
  189.     else if ( IrpSp->MinorFunction == 0xFF )
  190.     {
  191.         DbgPrint("IRP_MN_BOGUS");
  192.     }
  193.     else
  194.     {
  195.         DbgPrint("(Bogus)");
  196.     }
  197. }
  198.  
  199. VOID
  200. FASTCALL
  201. VfWmiTestStartedPdoStack(
  202.     IN PDEVICE_OBJECT   PhysicalDeviceObject
  203.     )
  204. {
  205.     IO_STACK_LOCATION irpSp;
  206.  
  207.     PAGED_CODE();
  208.    
  209.     *&irpSp.MajorFunction = IRP_MJ_CREATE;                
  210.     irpSp.Parameters.WMI.ProviderId = 0i64;
  211.     irpSp.Parameters.QueryDirectory.FileName = 0i64;
  212.     irpSp.Parameters.Read.ByteOffset.QuadPart = 0i64;
  213.     irpSp.Parameters.CreatePipe.Parameters = 0i64;
  214.     irpSp.DeviceObject = 0i64;
  215.     irpSp.FileObject = 0i64;
  216.     irpSp.CompletionRoutine = 0i64;
  217.     irpSp.Context = 0i64;
  218.  
  219.     if ( VfSettingsIsOptionEnabled(NULL, VERIFIER_OPTION_SEND_BOGUS_WMI_IRPS) )
  220.     {
  221.         irpSp.MajorFunction = IRP_MJ_SYSTEM_CONTROL;
  222.         irpSp.MinorFunction = 0xFFu;
  223.         irpSp.Parameters.WMI.ProviderId = (ULONG_PTR) PhysicalDeviceObject;
  224.         VfIrpSendSynchronousIrp(
  225.             PhysicalDeviceObject,
  226.             &irpSp,
  227.             TRUE,
  228.             STATUS_NOT_SUPPORTED,
  229.             (ULONG_PTR) NULL,
  230.             (ULONG_PTR) NULL,
  231.             NULL
  232.             );
  233.     }
  234. }
  235.  
  236. #ifdef ALLOC_DATA_PRAGMA
  237. #pragma data_seg()
  238. #pragma const_seg()
  239. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement