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.
 
 
 
 
 
 

377 lines
7.8 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
dispatch.c
Abstract:
This module contains the dispatch routines for SAC.
Author:
Sean Selitrennikoff (v-seans) - Jan 13, 1999
Revision History:
--*/
#include "sac.h"
NTSTATUS
DispatchClose(
IN PSAC_DEVICE_CONTEXT DeviceContext,
IN PIRP Irp
);
NTSTATUS
DispatchCreate(
IN PSAC_DEVICE_CONTEXT DeviceContext,
IN PIRP Irp
);
VOID
CancelReceiveIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
CompleteSendIrp (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
VOID
CancelSendIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
Dispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
This is the dispatch routine for SAC.
Arguments:
DeviceObject - Pointer to device object for target device
Irp - Pointer to I/O request packet
Return Value:
NTSTATUS -- Indicates whether the request was successfully queued.
--*/
{
PSAC_DEVICE_CONTEXT DeviceContext = (PSAC_DEVICE_CONTEXT)DeviceObject->DeviceExtension;
PIO_STACK_LOCATION IrpSp;
NTSTATUS Status;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC Dispatch: Entering.\n")));
IrpSp = IoGetCurrentIrpStackLocation(Irp);
switch (IrpSp->MajorFunction) {
case IRP_MJ_CREATE:
Status = DispatchCreate(DeviceContext, Irp);
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC Dispatch: Exiting with status 0x%x\n", Status)));
return Status;
case IRP_MJ_CLEANUP:
Status = STATUS_SUCCESS;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC Dispatch: Exiting cleanup status 0x%x\n", Status)));
return Status;
case IRP_MJ_CLOSE:
Status = DispatchClose(DeviceContext, Irp);
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC Dispatch: Exiting close status 0x%x\n", Status)));
return Status;
case IRP_MJ_DEVICE_CONTROL:
Status = DispatchDeviceControl(DeviceObject, Irp);
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC Dispatch: Exiting with status 0x%x\n", Status)));
return Status;
default:
IF_SAC_DEBUG(SAC_DEBUG_FAILS,
KdPrint(( "SAC Dispatch: Invalid major function %lx\n", IrpSp->MajorFunction )));
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
IoCompleteRequest(Irp, DeviceContext->PriorityBoost);
Status = STATUS_NOT_IMPLEMENTED;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC Dispatch: Exiting with status 0x%x\n", Status)));
return Status;
}
} // Dispatch
NTSTATUS
DispatchDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
This is the dispatch routine for SAC IOCTLs.
Arguments:
DeviceObject - Pointer to device object for target device
Irp - Pointer to I/O request packet
Return Value:
NTSTATUS -- Indicates whether the request was successfully queued.
--*/
{
NTSTATUS Status;
PSAC_DEVICE_CONTEXT DeviceContext = (PSAC_DEVICE_CONTEXT)DeviceObject;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchDeviceControl: Entering.\n")));
//
// If we made it this far, then the ioctl is invalid.
//
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
IoCompleteRequest(Irp, DeviceContext->PriorityBoost);
Status = STATUS_INVALID_DEVICE_REQUEST;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC DispatchDeviceControl: Exiting with status 0x%x\n", Status)));
return Status;
} // DispatchDeviceControl
NTSTATUS
DispatchShutdownControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
This is the dispatch routine which receives the shutdown IRP.
Arguments:
DeviceObject - Pointer to device object for target device
Irp - Pointer to I/O request packet
Return Value:
NTSTATUS -- Indicates whether the request was successfully queued.
--*/
{
UNREFERENCED_PARAMETER(DeviceObject);
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchShutdownControl: Entering.\n")));
//
// Notify any user.
//
SacPutSimpleMessage(SAC_ENTER);
SacPutSimpleMessage(SAC_SHUTDOWN);
SacPutSimpleMessage(SAC_ENTER);
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchShutdownControl: Exiting.\n")));
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
} // DispatchShutdownControl
NTSTATUS
DispatchCreate(
IN PSAC_DEVICE_CONTEXT DeviceContext,
IN PIRP Irp
)
/*++
Routine Description:
This is the dispatch routine for SAC IOCTL Create
Arguments:
DeviceContext - Pointer to device context for target device
Irp - Pointer to I/O request packet
Return Value:
NTSTATUS -- Indicates whether the request was successfully queued.
--*/
{
NTSTATUS Status;
PIO_STACK_LOCATION IrpSp;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchCreate: Entering.\n")));
//
// Check to see if we are done initializing.
//
if (!GlobalDataInitialized || !DeviceContext->InitializedAndReady) {
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_STATE;
IoCompleteRequest (Irp, DeviceContext->PriorityBoost);
Status = STATUS_INVALID_DEVICE_STATE;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC DispatchCreate: Exiting with status 0x%x\n", Status)));
return Status;
}
//
// Get a pointer to the current stack location in the IRP. This is where
// the function codes and parameters are stored.
//
IrpSp = IoGetCurrentIrpStackLocation (Irp);
//
// Case on the function that is being performed by the requestor. If the
// operation is a valid one for this device, then make it look like it was
// successfully completed, where possible.
//
switch (IrpSp->MajorFunction) {
//
// The Create function opens a connection to this device.
//
case IRP_MJ_CREATE:
Status = STATUS_UNSUCCESSFUL;
break;
default:
Status = STATUS_INVALID_DEVICE_REQUEST;
}
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = 0;
IoCompleteRequest (Irp, DeviceContext->PriorityBoost);
//
// Return the immediate status code to the caller.
//
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC DispatchCreate: Exiting with status 0x%x\n", Status)));
return Status;
}
NTSTATUS
DispatchClose(
IN PSAC_DEVICE_CONTEXT DeviceContext,
IN PIRP Irp
)
/*++
Routine Description:
This is the dispatch routine for SAC IOCTL Close
Arguments:
DeviceContext - Pointer to device context for target device
Irp - Pointer to I/O request packet
Return Value:
NTSTATUS -- Indicates whether the request was successfully queued.
--*/
{
NTSTATUS Status;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE, KdPrint(("SAC DispatchClose: Entering.\n")));
//
// Check to see if we are done initializing.
//
if (!GlobalDataInitialized || !DeviceContext->InitializedAndReady) {
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_STATE;
IoCompleteRequest (Irp, DeviceContext->PriorityBoost);
Status = STATUS_INVALID_DEVICE_STATE;
IF_SAC_DEBUG(SAC_DEBUG_FUNC_TRACE,
KdPrint(("SAC DispatchClose: Exiting with status 0x%x\n", Status)));
return Status;
}
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
IoCompleteRequest (Irp, DeviceContext->PriorityBoost);
Status = STATUS_UNSUCCESSFUL;
return Status;
}