189 lines
5.3 KiB
C
189 lines
5.3 KiB
C
/***************************************************************************
|
||
|
||
Copyright (c) 2000 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
Dot4Usb.sys - Lower Filter Driver for Dot4.sys for USB connected
|
||
IEEE 1284.4 devices.
|
||
|
||
File Name:
|
||
|
||
Util.c
|
||
|
||
Abstract:
|
||
|
||
Misc. Utility functions
|
||
|
||
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
|
||
|
||
ToDo in this file:
|
||
|
||
- code review and doc
|
||
- code review w/Joby
|
||
|
||
Author(s):
|
||
|
||
Joby Lafky (JobyL)
|
||
Doug Fritz (DFritz)
|
||
|
||
****************************************************************************/
|
||
|
||
#include "pch.h"
|
||
|
||
|
||
/************************************************************************/
|
||
/* DispatchPassThrough */
|
||
/************************************************************************/
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Default dispatch routine for IRP_MJ_xxx that we don't explicitly
|
||
// handle. Pass the request down to the device object below us.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// DevObj - pointer to Device Object that is the target of the request
|
||
// Irp - pointer to request
|
||
//
|
||
// Return Value:
|
||
//
|
||
// NTSTATUS
|
||
//
|
||
// Log:
|
||
// 2000-05-03 Code Reviewed - TomGreen, JobyL, DFritz
|
||
//
|
||
/************************************************************************/
|
||
NTSTATUS
|
||
DispatchPassThrough(
|
||
IN PDEVICE_OBJECT DevObj,
|
||
IN PIRP Irp
|
||
)
|
||
{
|
||
PDEVICE_EXTENSION devExt = DevObj->DeviceExtension;
|
||
NTSTATUS status = IoAcquireRemoveLock( &devExt->RemoveLock, Irp );
|
||
|
||
if( NT_SUCCESS(status) ) {
|
||
// RemoveLock acquired, continue with request
|
||
IoSkipCurrentIrpStackLocation( Irp );
|
||
status = IoCallDriver( devExt->LowerDevObj, Irp );
|
||
IoReleaseRemoveLock( &devExt->RemoveLock, Irp );
|
||
} else {
|
||
// unable to acquire RemoveLock - FAIL request
|
||
Irp->IoStatus.Status = status;
|
||
IoCompleteRequest( Irp, IO_NO_INCREMENT );
|
||
}
|
||
|
||
return status;
|
||
}
|
||
|
||
|
||
/************************************************************************/
|
||
/* CallLowerDriverSync */
|
||
/************************************************************************/
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// Call the driver below us synchronously. When this routine returns
|
||
// the calling routine once again owns the IRP.
|
||
//
|
||
// This routine acquires and holds a RemoveLock against the IRP
|
||
// while the IRP is in the possession of drivers below us.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// DevObj - pointer to Device Object that is issuing the request
|
||
// Irp - pointer to request
|
||
//
|
||
// Return Value:
|
||
//
|
||
// NTSTATUS
|
||
//
|
||
/************************************************************************/
|
||
NTSTATUS
|
||
CallLowerDriverSync(
|
||
IN PDEVICE_OBJECT DevObj,
|
||
IN PIRP Irp
|
||
)
|
||
{
|
||
PDEVICE_EXTENSION devExt = DevObj->DeviceExtension;
|
||
NTSTATUS status = IoAcquireRemoveLock( &devExt->RemoveLock, Irp );
|
||
|
||
if( NT_SUCCESS(status) ) {
|
||
KEVENT event;
|
||
KeInitializeEvent( &event, NotificationEvent, FALSE );
|
||
IoSetCompletionRoutine( Irp, CallLowerDriverSyncCompletion, &event, TRUE, TRUE, TRUE );
|
||
status = IoCallDriver( devExt->LowerDevObj, Irp );
|
||
if( STATUS_PENDING == status ) {
|
||
KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL );
|
||
status = Irp->IoStatus.Status;
|
||
}
|
||
IoReleaseRemoveLock( &devExt->RemoveLock, Irp );
|
||
} else {
|
||
TR_FAIL(("util::CallLowerDriverSync - Couldn't aquire RemoveLock"));
|
||
}
|
||
|
||
return status;
|
||
}
|
||
|
||
|
||
/************************************************************************/
|
||
/* CallLowerDriverSyncCompletion */
|
||
/************************************************************************/
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This is the completion routine for CallLowerDriverSync() that
|
||
// simply signals the event and stops the IRP completion from
|
||
// unwinding so that CallLowerDriverSync() can regain ownership
|
||
// of the IRP.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// DevObjOrNULL - Usually, this is this driver's device object.
|
||
// However, if this driver created the IRP, then
|
||
// there is no stack location in the IRP for this
|
||
// driver; so the kernel has no place to store the
|
||
// device object; ** so devObj will be NULL in
|
||
// this case **.
|
||
// Irp - pointer to request
|
||
//
|
||
// Return Value:
|
||
//
|
||
// NTSTATUS
|
||
//
|
||
/************************************************************************/
|
||
NTSTATUS
|
||
CallLowerDriverSyncCompletion(
|
||
IN PDEVICE_OBJECT DevObjOrNULL,
|
||
IN PIRP Irp,
|
||
IN PVOID Context
|
||
)
|
||
{
|
||
PKEVENT event = Context;
|
||
|
||
UNREFERENCED_PARAMETER( DevObjOrNULL );
|
||
UNREFERENCED_PARAMETER( Irp );
|
||
|
||
KeSetEvent(event, 0, FALSE);
|
||
|
||
return STATUS_MORE_PROCESSING_REQUIRED;
|
||
}
|
||
|
||
|