MULTIPLE_IRP_COMPLETE REQUESTS
От: Аноним  
Дата: 25.10.06 09:59
Оценка:
Не подскажите что за ошибка, и как лечится. Пытаюсь сделать вот что:


NTSTATUS DriverEntry(    IN PDRIVER_OBJECT DriverObject,
                        IN PUNICODE_STRING RegistryPath  )
{
    NTSTATUS status = STATUS_SUCCESS;

    ...............................................................

    DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchOpen;
   ..............................................................
    return status;
}


NTSTATUS DispatchOpen(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
    NTSTATUS status = STATUS_SUCCESS;

    Pxxx_DEVICE_EXTENSION  pDevExt = pDevObj->DeviceExtension;

    
    PAGED_CODE();

    ...................................................

    PIO_WORKITEM pIoWorkItem;

                    
      pDevExt->bWriteThreadAlive = TRUE;
                    
      pIoWorkItem = IoAllocateWorkItem(pDevObj);

    if(pIoWorkItem)
    {

    IoQueueWorkItem(pIoWorkItem, WorkerThreadStart, DelayedWorkQueue, (PVOID)pDevExt);
      
      KeWaitForSingleObject(&pDevExt->kInitEvent, Executive, KernelMode, FALSE, NULL);
                    
    status = pDevExt->NtThreadStatus;

    IoFreeWorkItem(pIoWorkItem);

     ...............................................

     }

    pIrp->IoStatus.Status      = status;
    pIrp->IoStatus.Information = 0;

    IoCompleteRequest(pIrp, IO_NO_INCREMENT);

    KdPrint(("DispatchOpen Exit 0x%0x \r\n", status));

    return status;
}

VOID WorkerThreadStart(PDEVICE_OBJECT  DeviceObject, PVOID  Context)
{
    Pxxx_DEVICE_EXTENSION pContext = (PVOID)Context;
    HANDLE WriteThreadHandle;

    KdPrint(("WorkerThreadStart Enter \r\n"));
 
    pContext->NtThreadStatus = PsCreateSystemThread(&WriteThreadHandle, 0, NULL, NULL, NULL, WriteThread, (PVOID)pContext);
    
    if(NT_SUCCESS(pContext->NtThreadStatus))
    {
      
        ObReferenceObjectByHandle(WriteThreadHandle, GENERIC_READ | GENERIC_WRITE, NULL, KernelMode, (PVOID *)&pContext->pWriteThread, NULL);
        ZwClose(WriteThreadHandle);
    }

    KeSetEvent(&pContext->kInitEvent, IO_NO_INCREMENT, FALSE);

}


VOID WriteThread(PVOID StartContext)
{
    
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.