NT4/private/ntos/dd/qic117/0x15a05.c
2020-09-30 17:12:29 +02:00

204 lines
6.0 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************************
*
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
* ALL RIGHTS RESERVED.
*
******************************************************************************
*
* FILE: \SE\DRIVER\Q117KDI\NT\SRC\0X15A05.C
*
* FUNCTION: kdi_ThreadRun
*
* PURPOSE:
*
* HISTORY:
* $Log: J:\se.vcs\driver\q117kdi\nt\src\0x15a05.c $
*
* Rev 1.2 10 Aug 1994 09:53:18 BOBLEHMA
* Changed cast from a dUDDWordPtr to dSDDWordPtr.
*
* Rev 1.1 18 Jan 1994 16:24:16 KEVINKES
* Updated the debug code and fixed compile errors.
*
* Rev 1.0 02 Dec 1993 15:08:44 KEVINKES
* Initial Revision.
*
*****************************************************************************/
#define FCT_ID 0x15A05
#include "include\public\adi_api.h"
#include "include\public\frb_api.h"
#include "q117kdi\include\kdiwhio.h"
#include "q117kdi\include\kdiwpriv.h"
#include "include\private\kdi_pub.h"
#include "include\private\cqd_pub.h"
/*endinclude*/
dVoid kdi_ThreadRun
(
/* INPUT PARAMETERS: */
KdiContextPtr kdi_context
/* UPDATE PARAMETERS: */
/* OUTPUT PARAMETERS: */
)
/* COMMENTS: *****************************************************************
*
* Routine Description:
*
* This is the code executed by the system thread created when the
* floppy driver initializes. This thread loops forever (or until a
* flag is set telling the thread to kill itself) processing packets
* put into the queue by the dispatch routines.
*
* For each packet, this thread calls appropriate routines to process
* the request, and then calls FlFinishOperation() to complete the
* packet.
*
* Arguments:
*
* kdi_context - a pointer to our data area for the controller being
* supported (there is one thread per controller).
*
* Return Value:
*
* None.
*
* DEFINITIONS: *************************************************************/
{
/* DATA: ********************************************************************/
PIRP irp;
PIO_STACK_LOCATION irp_stack_ptr;
PLIST_ENTRY request;
NTSTATUS ntStatus = 0;
ADIRequestHdrPtr frb;
dStatus status;
/* CODE: ********************************************************************/
/* Set thread priority to lowest realtime level. */
KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);
do {
/* Wait for a request from the dispatch routines. */
/* KeWaitForSingleObject won't return error here - this thread */
/* isn't alertable and won't take APCs, and we're not passing in */
/* a timeout. */
(dVoid) KeWaitForSingleObject(
(dVoidPtr) &kdi_context->request_semaphore,
UserRequest,
KernelMode,
dFALSE,
(dSDDWordPtr) dNULL_PTR );
if ( kdi_context->unloading_driver ) {
kdi_CheckedDump(QIC117INFO,
"q117i: Thread asked to kill itself\n", 0l);
PsTerminateSystemThread( STATUS_SUCCESS );
}
while ( !IsListEmpty( &( kdi_context->list_entry ) ) ) {
/* Get the request from the queue. We know there is one, */
/* because of the check above. */
request = ExInterlockedRemoveHeadList(
&kdi_context->list_entry,
&kdi_context->list_spin_lock );
kdi_context->queue_empty =
IsListEmpty( &( kdi_context->list_entry ) );
irp = CONTAINING_RECORD( request, IRP, Tail.Overlay.ListEntry );
irp_stack_ptr = IoGetCurrentIrpStackLocation( irp );
if ( kdi_context->clear_queue ||
irp_stack_ptr->Parameters.DeviceIoControl.IoControlCode ==
IOCTL_QIC117_CLEAR_QUEUE) {
if (irp_stack_ptr->Parameters.DeviceIoControl.IoControlCode == IOCTL_QIC117_CLEAR_QUEUE) {
kdi_CheckedDump(QIC117INFO,
"Q117i: processing IOCTL_QIC117_CLEAR_QUEUE : TRUE\n", 0l);
irp->IoStatus.Status = kdi_ClearIO( irp );
/* NOTE: This is temporary until we ca find how to */
/* correctly free the Mdl using the io subsytem. */
if (irp->MdlAddress != NULL) {
IoFreeMdl(irp->MdlAddress);
irp->MdlAddress = NULL;
}
IoCompleteRequest( irp, IO_DISK_INCREMENT );
(VOID) KeSetEvent(
&kdi_context->clear_queue_event,
(KPRIORITY) 0,
FALSE );
} else {
kdi_CheckedDump(QIC117INFO,
"Q117i: processing IOCTL_QIC117_DRIVE_REQUEST : TRUE\n", 0l);
irp->IoStatus.Status = STATUS_CANCELLED;
/* NOTE: This is temporary until we ca find how to */
/* correctly free the Mdl using the io subsytem. */
if (irp->MdlAddress != dNULL_PTR) {
IoFreeMdl(irp->MdlAddress);
irp->MdlAddress = dNULL_PTR;
}
IoCompleteRequest( irp, IO_DISK_INCREMENT );
}
} else {
// kdi_context->current_irp = irp;
frb = (ADIRequestHdrPtr)irp_stack_ptr->Parameters.DeviceIoControl.Type3InputBuffer;
if (irp->MdlAddress != dNULL_PTR) {
frb->drv_physical_ptr = irp->MdlAddress;
frb->drv_logical_ptr = MmGetSystemAddressForMdl(irp->MdlAddress);
}
status = cqd_ProcessFRB(
kdi_context->cqd_context,
frb);
irp->IoStatus.Status = kdi_TranslateError(
kdi_context->device_object,
status );
/* NOTE: This is temporary until we ca find how to */
/* correctly free the Mdl using the io subsytem. */
if (irp->MdlAddress != NULL) {
IoFreeMdl(irp->MdlAddress);
irp->MdlAddress = NULL;
}
IoCompleteRequest( irp, IO_DISK_INCREMENT );
}
} /* while there's packets to process */
} while ( TRUE );
}