Показать сообщение отдельно

  #14  
Старый 28.09.2007, 15:30
slesh
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

подскажите что я делаю не так. почему BSOD?
При установке ProtectedPid - ставится всё нормально и пашет отлично.
А при чтении его - BSOD. читаю через

PID,TrId:dword;
DeviceIoControl(hDriver, $23456, nil, 0, @PID, 4, TrId, nil);

Вот код обработчика
Код:
HANDLE ProtectedPid;

NTSTATUS DriverDispatcher(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 NTSTATUS status;
 PIO_STACK_LOCATION irpStack;
 irpStack = IoGetCurrentIrpStackLocation (Irp);
 
if (irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL) 
 {
  switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
   {
	case 0x12345:
	    if (irpStack->Parameters.DeviceIoControl.InputBufferLength == sizeof(HANDLE)) 
		{
		       
				ProtectedPid=*(HANDLE *)Irp->AssociatedIrp.SystemBuffer;
				DPRINT("PID= %d",ProtectedPid);
	 	}
		break;
	case 0x23456:
	if (irpStack->Parameters.Read.Length < 4)
    {
	    DPRINT("LENGTH < 4");
        Irp->IoStatus.Status = status = STATUS_BUFFER_TOO_SMALL;
        Irp->IoStatus.Information  = 0;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        return status;
    } 
	 else
	{
     DPRINT("LENGTH OK");	
     Irp->IoStatus.Information  = 4;
// чтото тут я не мойму как реализовать.
	 *(HANDLE *)Irp->AssociatedIrp.SystemBuffer=ProtectedPid;
	 Irp->IoStatus.Status = status = STATUS_SUCCESS;
  	 IoCompleteRequest (Irp, IO_NO_INCREMENT);
     return status;
	}
	break;
	
	default: status = STATUS_INVALID_DEVICE_REQUEST;
	}
 
 }

Irp->IoStatus.Status = status;
IoCompleteRequest (Irp, IO_NO_INCREMENT);

 return status;
 }
 
Ответить с цитированием