Dispatch.c
上传用户:zanmei2
上传日期:2010-03-06
资源大小:775k
文件大小:3k
源码类别:

通讯编程文档

开发平台:

C/C++

  1. /*++
  2. Copyright (c) 2005  Changzhi Zhou All Rights Reserved
  3. Module Name:
  4.     Dispatch.c
  5. Abstract:
  6.     This module works for Dispatch routines which are
  7. Create, Close, Cleanup, PowerDispatch.
  8. Environment:
  9.     Kernel mode
  10. Revision History:
  11. Changzhi Zhou Dec 20  2004
  12. --*/
  13. #include <ntddk.h>
  14. #include "main.h"
  15. #include "..incwdmioctl.h"
  16. #ifdef ALLOC_PRAGMA
  17. #pragma alloc_text (PAGE, SamplePowerDispatch)
  18. #endif
  19. NTSTATUS SampleCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  20. {                           // SampleCreate
  21.     PDEVICE_EXTENSION   deviceExtension;
  22. NTSTATUS status;
  23. KIRQL oldIrql;
  24.     
  25. PAGED_CODE();
  26.     
  27. DbgPrint("--- IRP_MJ_CREATn");
  28. status = STATUS_SUCCESS;
  29. deviceExtension = DeviceObject->DeviceExtension;
  30. if( ( deviceExtension->DevicePnPState != Working) ||
  31. deviceExtension->bIsOpen )
  32. {
  33. status = STATUS_INVALID_DEVICE_STATE;
  34. return CompleteRequest(Irp, status, 0);
  35.     }
  36. deviceExtension->bIsOpen = TRUE;
  37. SampleIoIncrement ( deviceExtension );
  38. return CompleteRequest(Irp, status, 0);
  39. }                           // SampleCreate
  40. NTSTATUS SampleClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  41. {                           // SampleClose
  42. NTSTATUS status;
  43.     PDEVICE_EXTENSION           deviceExtension;
  44.     PAGED_CODE();
  45. status = STATUS_SUCCESS;
  46.   deviceExtension = DeviceObject->DeviceExtension;
  47. DbgPrint("--- IRP_MJ_CLOSEn");
  48. deviceExtension->bIsOpen = FALSE;
  49. SampleIoDecrement ( deviceExtension );
  50. return CompleteRequest(Irp, STATUS_SUCCESS, 0);
  51. }                           // SampleClose
  52. NTSTATUS SampleCleanup(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
  53. {
  54. NTSTATUS status;
  55. PIO_STACK_LOCATION IrpStack;
  56.     PDEVICE_EXTENSION           deviceExtension;
  57. KIRQL oldIrql;
  58.     PAGED_CODE();
  59. deviceExtension = DeviceObject->DeviceExtension;
  60.     DbgPrint("Entering IRP_MJ_CLEANUPn");
  61. status = STATUS_SUCCESS;
  62. IrpStack = IoGetCurrentIrpStackLocation(Irp);
  63. KeAcquireSpinLock ( &deviceExtension->ThreadSpinLock, &oldIrql );
  64. if( deviceExtension->WaitOnMaskIrp ){ // 取消上一次的WAIT_ON_MASK Irp
  65. *((ULONG *)deviceExtension->WaitOnMaskIrp->AssociatedIrp.SystemBuffer) = 0;
  66. CompleteRequest( deviceExtension->WaitOnMaskIrp, STATUS_SUCCESS, sizeof( ULONG ));
  67. SampleIoDecrement ( deviceExtension );
  68. deviceExtension->WaitOnMaskIrp = NULL;
  69. }
  70. KeReleaseSpinLock ( &deviceExtension->ThreadSpinLock, oldIrql );
  71. return CompleteRequest( Irp, status, 0 );
  72. }
  73. NTSTATUS
  74. SamplePowerDispatch(
  75.     IN PDEVICE_OBJECT    DeviceObject,
  76.     IN PIRP              Irp
  77.     )
  78. /*++
  79. Routine Description:
  80.     This routine is the dispatch routine for power irps.
  81. Arguments:
  82.     DeviceObject - Pointer to the device object.
  83.     Irp - Pointer to the request packet.
  84. Return Value:
  85.     NT Status code
  86. --*/
  87. {
  88. NTSTATUS status;
  89.     PDEVICE_EXTENSION   deviceExtension;
  90.     
  91.     PAGED_CODE ();
  92. DebugPrint(("Enter DispatchPower routine...n"));
  93.     deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
  94.     PoStartNextPowerIrp(Irp);
  95.     IoSkipCurrentIrpStackLocation(Irp);
  96. DebugPrint(("NextLowerDriver:  0x%xn", deviceExtension->NextLowerDriver ));
  97. status = PoCallDriver(deviceExtension->NextLowerDriver, Irp);
  98. DebugPrint(("-Exit Powern") );
  99.     return status;
  100. }