www.pudn.com > VSer.rar > Dispatch.c


/*++ 
 
Copyright (c) 2005  Changzhi Zhou All Rights Reserved 
 
Module Name: 
 
    Dispatch.c 
 
Abstract: 
 
    This module works for Dispatch routines which are 
	Create, Close, Cleanup, PowerDispatch. 
 
Environment: 
 
    Kernel mode 
 
Revision History: 
 
	Changzhi Zhou Dec 20  2004 
 
--*/ 
#include  
#include "main.h" 
#include "..\inc\wdmioctl.h" 
 
#ifdef ALLOC_PRAGMA 
#pragma alloc_text (PAGE, SamplePowerDispatch) 
#endif 
 
NTSTATUS SampleCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{                           // SampleCreate 
    PDEVICE_EXTENSION   deviceExtension; 
	NTSTATUS			status; 
	KIRQL				oldIrql; 
     
	PAGED_CODE(); 
     
	DbgPrint("--- IRP_MJ_CREAT\n"); 
	status = STATUS_SUCCESS; 
	deviceExtension = DeviceObject->DeviceExtension; 
	if( ( deviceExtension->DevicePnPState != Working) || 
		deviceExtension->bIsOpen ) 
	{ 
		status = STATUS_INVALID_DEVICE_STATE; 
		return CompleteRequest(Irp, status, 0); 
    } 
	deviceExtension->bIsOpen = TRUE; 
	SampleIoIncrement ( deviceExtension ); 
	return CompleteRequest(Irp, status, 0); 
}                           // SampleCreate 
 
NTSTATUS SampleClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{                           // SampleClose 
	NTSTATUS			status; 
    PDEVICE_EXTENSION           deviceExtension; 
 
    PAGED_CODE(); 
	status = STATUS_SUCCESS; 
 	deviceExtension = DeviceObject->DeviceExtension; 
	DbgPrint("--- IRP_MJ_CLOSE\n"); 
	deviceExtension->bIsOpen = FALSE; 
	SampleIoDecrement ( deviceExtension ); 
	return CompleteRequest(Irp, STATUS_SUCCESS, 0); 
}                           // SampleClose 
 
NTSTATUS SampleCleanup(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) 
{ 
	NTSTATUS			status; 
	PIO_STACK_LOCATION	IrpStack; 
    PDEVICE_EXTENSION           deviceExtension; 
	KIRQL				oldIrql; 
 
    PAGED_CODE(); 
	deviceExtension = DeviceObject->DeviceExtension; 
    DbgPrint("Entering IRP_MJ_CLEANUP\n"); 
	status = STATUS_SUCCESS; 
	IrpStack = IoGetCurrentIrpStackLocation(Irp); 
 
	KeAcquireSpinLock ( &deviceExtension->ThreadSpinLock, &oldIrql ); 
	if( deviceExtension->WaitOnMaskIrp ){	// 取消上一次的WAIT_ON_MASK Irp 
		*((ULONG *)deviceExtension->WaitOnMaskIrp->AssociatedIrp.SystemBuffer) = 0; 
		CompleteRequest( deviceExtension->WaitOnMaskIrp, STATUS_SUCCESS, sizeof( ULONG )); 
		SampleIoDecrement ( deviceExtension ); 
		deviceExtension->WaitOnMaskIrp = NULL; 
	} 
	KeReleaseSpinLock ( &deviceExtension->ThreadSpinLock, oldIrql ); 
	return CompleteRequest( Irp, status, 0 ); 
} 
 
 
NTSTATUS 
SamplePowerDispatch( 
    IN PDEVICE_OBJECT    DeviceObject, 
    IN PIRP              Irp 
    ) 
/*++ 
 
Routine Description: 
 
    This routine is the dispatch routine for power irps. 
 
Arguments: 
 
    DeviceObject - Pointer to the device object. 
 
    Irp - Pointer to the request packet. 
 
Return Value: 
 
    NT Status code 
--*/ 
{ 
	NTSTATUS	status; 
    PDEVICE_EXTENSION   deviceExtension; 
     
    PAGED_CODE (); 
 
	DebugPrint(("Enter DispatchPower routine...\n")); 
 
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; 
    PoStartNextPowerIrp(Irp); 
    IoSkipCurrentIrpStackLocation(Irp); 
	DebugPrint(("NextLowerDriver:  0x%x\n", deviceExtension->NextLowerDriver )); 
	status = PoCallDriver(deviceExtension->NextLowerDriver, Irp); 
 
	DebugPrint(("-Exit Power\n") ); 
    return status; 
}