Привет Всем!
Помогите плз...
Пытаюсь от драйвера данные получить и не могу, т.к. DeviceIoControl не выполняется, а GetLastError говорит про ERROR_GEN_FAILURE.
В самом драйвере в диспетчерскую функцию заходит при запросе и даже копирует в буфер, но в юзермоде вот такая ошибка.
В чем причина?
Юзермод:
DeviceIoControl(hDriver, IOCTL_GET_PROCINFO, NULL, 0, chBuffer, 512, &dwRet, NULL)
Обработка запросов в драйвере:
NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
ULONG ulOutputBufferLength;
ULONG ulBytesSend = 0;
PIO_STACK_LOCATION irpStack;
PCHAR pOutputBuffer;
LARGE_INTEGER liWaitMutex = {0xFFFFFFFF, 0xFFFFFFFF};
PLIST_ENTRY pListEntry;
PPROC_INFO pProcInfo;
irpStack = IoGetCurrentIrpStackLocation(Irp);
switch(irpStack->Parameters.DeviceIoControl.IoControlCode) {
case IOCTL_GET_PROCINFO:
ulOutputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
if( ulOutputBufferLength >= MAX_PROC_BUFFER_SIZE ) {
pOutputBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
KeWaitForSingleObject(&kProcInfoMutex, Executive, KernelMode, FALSE, &liWaitMutex);
if( !IsListEmpty(&DoubleHeadProcInfoList) ) {
pListEntry = RemoveHeadList(&DoubleHeadProcInfoList);
pProcInfo = CONTAINING_RECORD(pListEntry, PROC_INFO, linkfield);
RtlCopyMemory(pOutputBuffer, pProcInfo->chBuffer, pProcInfo->ulBuffLen);
ulBytesSend = pProcInfo->ulBuffLen;
ExFreePool(pProcInfo);
} // if( !IsListEmpty(&DoubleHeadProcInfoList) )
KeReleaseMutex(&kProcInfoMutex, FALSE);
} // if( irpStack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(PROC_INFO) )
break;
default:
break;
} // switch(irpStack->Parameters.DeviceIoControl.IoControlCode)
Irp->IoStatus.Status = ntStatus;
if(ntStatus == STATUS_SUCCESS)
Irp->IoStatus.Information = ulBytesSend;
else
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return ntStatus;
}
не понял прикола, а почему ntStatus остается STATUS_UNSUCCESSFUL до return'а?
Здравствуйте, Аноним, Вы писали:
А>не понял прикола, а почему ntStatus остается STATUS_UNSUCCESSFUL до return'а?
Да точно, забыл в STATUS_SUCCESSFUL установить после копирования
Спасиб!
SO>Да точно, забыл в STATUS_SUCCESSFUL установить после копирования
STATUS_SUCCESS.
Не вводите в заблуждение остальных.