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