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.
|
|
#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 ); }
|