Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

126 lines
3.8 KiB

/***************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
Dot4Usb.sys - Lower Filter Driver for Dot4.sys for USB connected
IEEE 1284.4 devices.
File Name:
OpenClos.c
Abstract:
Dispatch routines for IRP_MJ_CREATE and IRP_MJ_CLOSE
Environment:
Kernel mode only
Notes:
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.
Copyright (c) 2000 Microsoft Corporation. All Rights Reserved.
Revision History:
01/18/2000 : created
Author(s):
Doug Fritz (DFritz)
Joby Lafky (JobyL)
****************************************************************************/
#include "pch.h"
/************************************************************************/
/* DispatchCreate */
/************************************************************************/
//
// Routine Description:
//
// Dispatch routine for IRP_MJ_CREATE
//
// Arguments:
//
// DevObj - pointer to Device Object that is the target of the create
// Irp - pointer to the create IRP
//
// Return Value:
//
// NTSTATUS
//
/************************************************************************/
NTSTATUS
DispatchCreate(
IN PDEVICE_OBJECT DevObj,
IN PIRP Irp
)
{
PDEVICE_EXTENSION devExt = DevObj->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock( &devExt->RemoveLock, Irp );
TR_VERBOSE(("DispatchCreate"));
if( NT_SUCCESS(status) ) {
IoSkipCurrentIrpStackLocation( Irp );
status = IoCallDriver( devExt->LowerDevObj, Irp );
IoReleaseRemoveLock( &devExt->RemoveLock, Irp );
} else {
// unable to acquire RemoveLock - fail CREATE
Irp->IoStatus.Status = status;
IoCompleteRequest( Irp, IO_NO_INCREMENT );
}
return status;
}
/************************************************************************/
/* DispatchClose */
/************************************************************************/
//
// Routine Description:
//
// Dispatch routine for IRP_MJ_CLOSE
//
// Arguments:
//
// DevObj - pointer to Device Object that is the target of the close
// Irp - pointer to the close IRP
//
// Return Value:
//
// NTSTATUS
//
/************************************************************************/
NTSTATUS
DispatchClose(
IN PDEVICE_OBJECT DevObj,
IN PIRP Irp
)
{
PDEVICE_EXTENSION devExt = DevObj->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock( &devExt->RemoveLock, Irp );
TR_VERBOSE(("DispatchClose"));
if( NT_SUCCESS(status) ) {
IoSkipCurrentIrpStackLocation( Irp );
status = IoCallDriver( devExt->LowerDevObj, Irp );
IoReleaseRemoveLock( &devExt->RemoveLock, Irp );
} else {
// unable to acquire RemoveLock - succeed CLOSE anyway
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest( Irp, IO_NO_INCREMENT );
}
return status;
}