Самоучитель по программированию систем защиты

       

обработки



Пример обработки



Пример получения адресов и длин буферов в диспетчерской функции драйвера, обрабатывающей функциональные коды IRP_MJ_CREATE, IRP_MJ_CLOSE и IRP_MJ_DEVICE_CONTROL:

stack = loGetCurrentlrpStackLocation (Irp); switch (pIrpStack->MajorFunction) {

case IRP_MJ_CREATE: case IRP_MJ_CLOSE: break;

case IRP_MJ_DEVICE_CONTROL:

switch (stack->Parameters.DeviceloControl.loControlCode) { case IOCTL_MY_BUFFERED:

InBuffer = Irp->AssociatedIrp.SystemBuffer; InLength = stack->Parameters.DeviceloControl.InputBuffer.Length; OutBuffer = Irp->AssociatedIrp.SystemBuffer; OutLength = stack->Parameters.DeviceloControl.OutputBufferLength; case IOCTL_MY_IN_DIRECT:

//OutBuffer доступен только для чтения InBuffer = Irp->AssociatedIrp.SystemBuffer; InLength = stack->Parameters.DeviceloControl.InputBufferLength; OutBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );

OutLength = stack->Parameters.DeviceloControl.OutputBufferLength; break; case IOCTL_MY_OUT_DIRECT:

//OutBuffer доступен для чтения/записи InBuffer = Irp->AssociatedIrp.SystemBuffer; InLength = stack->Parameters.DeviceloControl.InputBufferLength; OutBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress

);

OutLength = stack->Parameters.DeviceloControl.OutputBufferLength; break;

case IOCTL_MY_NEITHER:

InBuffer = irpStack->Parameters.DeviceloControl.Type3InputBuffer;

InLength = irpStack->Parameters.DeviceIoControl.InputBufferLength; OutBuffer = Irp->UserBuffer;

OutLength = irpStack->Parameters.Device!oControl.OutputBufferLength; break;

 



Содержание раздела