windows-nt/Source/XPSP1/NT/drivers/parallel/parport2/pdocreate.c
2020-09-26 16:20:57 +08:00

71 lines
2.5 KiB
C

#include "pch.h"
NTSTATUS
PptPdoCreateOpen(
IN PDEVICE_OBJECT Pdo,
IN PIRP Irp
)
{
NTSTATUS status;
PPDO_EXTENSION pdx = Pdo->DeviceExtension;
// bail out if a delete is pending for this device object
if(pdx->DeviceStateFlags & PPT_DEVICE_DELETE_PENDING) {
return P4CompleteRequest( Irp, STATUS_DELETE_PENDING, 0 );
}
// bail out if device has been removed
if(pdx->DeviceStateFlags & (PPT_DEVICE_REMOVED|PPT_DEVICE_SURPRISE_REMOVED) ) {
return P4CompleteRequest( Irp, STATUS_DEVICE_REMOVED, 0 );
}
// bail out if caller is confused and thinks that we are a directory
if( IoGetCurrentIrpStackLocation(Irp)->Parameters.Create.Options & FILE_DIRECTORY_FILE ) {
return P4CompleteRequest( Irp, STATUS_NOT_A_DIRECTORY, 0 );
}
// this is an exclusive access device - fail IRP if we are already open
ExAcquireFastMutex(&pdx->OpenCloseMutex);
if( InterlockedIncrement( &pdx->OpenCloseRefCount ) != 1 ) {
InterlockedDecrement( &pdx->OpenCloseRefCount );
ExReleaseFastMutex( &pdx->OpenCloseMutex );
return P4CompleteRequest( Irp, STATUS_ACCESS_DENIED, 0 );
}
ExReleaseFastMutex(&pdx->OpenCloseMutex);
PptPdoGetPortInfoFromFdo( Pdo );
//
// Set the default ieee1284 modes
//
ParInitializeExtension1284Info( pdx );
// used to pause worker thread when we enter a "Hold Requests" state due to PnP requests
KeInitializeEvent( &pdx->PauseEvent, NotificationEvent, TRUE );
// set to TRUE to tell worker thread to kill itself
pdx->TimeToTerminateThread = FALSE;
// we are an exclusive access device - we should not already have a worker thread
PptAssert( !pdx->ThreadObjectPointer );
// dispatch routines signal worker thread on this semaphore when there is work for worker thread to do
KeInitializeSemaphore(&pdx->RequestSemaphore, 0, MAXLONG);
// create worker thread to handle serialized requests at Passive Level IRQL
status = ParCreateSystemThread( pdx );
if( status != STATUS_SUCCESS ) {
DD((PCE)pdx,DDW,"PptPdoCreateOpen - FAIL worker thread creation\n");
ExAcquireFastMutex( &pdx->OpenCloseMutex );
InterlockedDecrement( &pdx->OpenCloseRefCount );
if( pdx->OpenCloseRefCount < 0 ) {
pdx->OpenCloseRefCount = 0;
}
ExReleaseFastMutex( &pdx->OpenCloseMutex );
} else {
DD((PCE)pdx,DDT,"PptPdoCreateOpen - SUCCESS\n");
}
return P4CompleteRequest( Irp, status, 0 );
}