|
|
/***************************************************************************
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; }
|