279 lines
4.3 KiB
C
279 lines
4.3 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1998 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
dispatch.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains the IRP dispatch code for SPUD.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Keith Moore (keithmo) 09-Feb-1998
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
#include "spudp.h"
|
|||
|
|
|||
|
|
|||
|
#ifdef ALLOC_PRAGMA
|
|||
|
#pragma alloc_text( PAGE, SpudIrpCreate )
|
|||
|
#pragma alloc_text( PAGE, SpudIrpClose )
|
|||
|
#pragma alloc_text( PAGE, SpudIrpQuery )
|
|||
|
#endif
|
|||
|
#if 0
|
|||
|
NOT PAGEABLE -- SpudIrpCleanup
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Public functions.
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SpudIrpCreate(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine handles IRP_MJ_CREATE IRPs. IRP_MJ_CREATE is issued when
|
|||
|
a new file object is being created.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceObject - Pointer to the target device object.
|
|||
|
|
|||
|
Irp - Pointer to the I/O request packet.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS - Completion status.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
NTSTATUS status = STATUS_SUCCESS;
|
|||
|
PVOID xchg;
|
|||
|
|
|||
|
//
|
|||
|
// Sanity check.
|
|||
|
//
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
|
|||
|
//
|
|||
|
// Ensure this is the only process that may access the driver.
|
|||
|
//
|
|||
|
|
|||
|
xchg = InterlockedCompareExchangePointer(
|
|||
|
(PVOID *)&SpudOwningProcess,
|
|||
|
(PVOID)PsGetCurrentProcess(),
|
|||
|
NULL
|
|||
|
);
|
|||
|
|
|||
|
ASSERT( xchg == NULL );
|
|||
|
|
|||
|
//
|
|||
|
// Complete the IRP.
|
|||
|
//
|
|||
|
|
|||
|
Irp->IoStatus.Status = status;
|
|||
|
IoCompleteRequest( Irp, SPUD_PRIORITY_BOOST );
|
|||
|
|
|||
|
return status;
|
|||
|
|
|||
|
} // SpudIrpCreate
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SpudIrpClose(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine handles IRP_MJ_CLOSE IRPs. IRP_MJ_CLOSE is issued when
|
|||
|
the final reference to a file object is removed and the object is
|
|||
|
being destroyed.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceObject - Pointer to the target device object.
|
|||
|
|
|||
|
Irp - Pointer to the I/O request packet.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS - Completion status.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
NTSTATUS status = STATUS_SUCCESS;
|
|||
|
PVOID xchg;
|
|||
|
|
|||
|
//
|
|||
|
// Sanity check.
|
|||
|
//
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
|
|||
|
//
|
|||
|
// Clear the owner process.
|
|||
|
//
|
|||
|
|
|||
|
xchg = InterlockedCompareExchangePointer(
|
|||
|
(PVOID *)&SpudOwningProcess,
|
|||
|
NULL,
|
|||
|
(PVOID)PsGetCurrentProcess()
|
|||
|
);
|
|||
|
|
|||
|
ASSERT( xchg == (PVOID)PsGetCurrentProcess() );
|
|||
|
|
|||
|
//
|
|||
|
// Dereference the I/O completion port.
|
|||
|
//
|
|||
|
|
|||
|
SpudDereferenceCompletionPort();
|
|||
|
|
|||
|
//
|
|||
|
// Complete the IRP;
|
|||
|
//
|
|||
|
|
|||
|
Irp->IoStatus.Status = status;
|
|||
|
IoCompleteRequest( Irp, SPUD_PRIORITY_BOOST );
|
|||
|
|
|||
|
return status;
|
|||
|
|
|||
|
} // SpudIrpClose
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SpudIrpCleanup(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine handles IRP_MJ_CLEANUP IRPs. IRP_MJ_CLEANUP is issued
|
|||
|
when the last handle to a file object is closed.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceObject - Pointer to the target device object.
|
|||
|
|
|||
|
Irp - Pointer to the I/O request packet.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS - Completion status.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
NTSTATUS status = STATUS_SUCCESS;
|
|||
|
|
|||
|
//
|
|||
|
// Complete the IRP;
|
|||
|
//
|
|||
|
|
|||
|
Irp->IoStatus.Status = status;
|
|||
|
IoCompleteRequest( Irp, SPUD_PRIORITY_BOOST );
|
|||
|
|
|||
|
return status;
|
|||
|
|
|||
|
} // SpudIrpCleanup
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
SpudIrpQuery(
|
|||
|
IN PDEVICE_OBJECT DeviceObject,
|
|||
|
IN PIRP Irp
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine handles IRP_MJ_QUERY IRPs.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DeviceObject - Pointer to the target device object.
|
|||
|
|
|||
|
Irp - Pointer to the I/O request packet.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
NTSTATUS - Completion status.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
NTSTATUS status = STATUS_SUCCESS;
|
|||
|
PIO_STACK_LOCATION irpSp;
|
|||
|
PFILE_NAME_INFORMATION nameInfo;
|
|||
|
ULONG bytesRequired;
|
|||
|
|
|||
|
//
|
|||
|
// Sanity check.
|
|||
|
//
|
|||
|
|
|||
|
PAGED_CODE();
|
|||
|
|
|||
|
//
|
|||
|
// Validate the input arguments.
|
|||
|
//
|
|||
|
|
|||
|
irpSp = IoGetCurrentIrpStackLocation( Irp );
|
|||
|
|
|||
|
bytesRequired = sizeof(*nameInfo) - sizeof(nameInfo->FileName);
|
|||
|
|
|||
|
if( irpSp->Parameters.QueryFile.Length >= bytesRequired ) {
|
|||
|
status = STATUS_INVALID_PARAMETER;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Return an empty name.
|
|||
|
//
|
|||
|
|
|||
|
if( NT_SUCCESS(status) ) {
|
|||
|
nameInfo = Irp->AssociatedIrp.SystemBuffer;
|
|||
|
|
|||
|
nameInfo->FileNameLength = 0;
|
|||
|
Irp->IoStatus.Information = bytesRequired;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Complete the IRP.
|
|||
|
//
|
|||
|
|
|||
|
Irp->IoStatus.Status = status;
|
|||
|
IoCompleteRequest( Irp, SPUD_PRIORITY_BOOST );
|
|||
|
|
|||
|
return status;
|
|||
|
|
|||
|
} // SpudIrpQuery
|
|||
|
|