Программирование драйверов Windows


Исполняемый код драйвера - часть 14


HANDLE hEvent; // Объект события - без имени: PKEVENT pEvent = IoCreateSynchronizationEvent( &eventName, &hEvent ); if(pEvent==NULL) { // Объект события не был создан #if DBG==1 DbgPrint("LPTPORT: DeviceControlRoutine: IOCTL_TAKE_EVENT,\n" " error - event wasn't created.\n"); #endif // Завершение без переноса данных клиенту: return CompleteIrp( pIrp, STATUS_UNSUCCESSFUL, 0 ); } #if DBG==1 DbgPrint("LPTPORT: DeviceControlRoutine: IOCTL_TAKE_EVENT,\n" " event named %ws successfully created.\n", eventName.Buffer); #endif pDevExt-&#62pEvent = pEvent; pDevExt-&#62hEvent = hEvent; // Предустанавливаем объект события в несигнальное состояние: KeClearEvent(pDevExt-&#62pEvent); } // Cообщаем об объекте события клиенту - передаем дескриптор RtlCopyMemory( pIrp-&#62AssociatedIrp.SystemBuffer, &pDevExt-&#62hEvent, sizeof(HANDLE) ); #if DBG==1 DbgPrint( "LPTPORT: DeviceControlRoutine: IOCTL_TAKE_EVENT,\n" " event handle = %04X(hex) is sent to user.\n", pDevExt-&#62hEvent); #endif return CompleteIrp( pIrp, STATUS_SUCCESS, sizeof(HANDLE) ); } case IOCTL_CLOSE_EVENT: { if(pDevExt-&#62pEvent!=NULL) // объект события был создан { NTSTATUS sts = ZwClose(pDevExt-&#62hEvent); #if DBG==1 if(sts==STATUS_SUCCESS) DbgPrint("LPTPORT: DeviceControlRoutine: IOCTL_CLOSE_EVENT,\n" " event handle closed with STATUS_SUCCESS.\n"); DbgPrint("LPTPORT: DeviceControlRoutine: IOCTL_CLOSE_EVENT,\n" " event (handle %04Xhex) closing status = %d.\n", pDevExt-&#62hEvent, sts ); #endif // Во всяком случае, эти событием пользоваться не будем: pDevExt-&#62pEvent = NULL; pDevExt-&#62hEvent = NULL; } return CompleteIrp( pIrp, STATUS_SUCCESS, 0 ); } default: { #if DBG==1 DbgPrint("LPTPORT: DeviceControlRoutine: bad IOCTL code."); #endif // Завершение без переноса данных клиенту: status = STATUS_INVALID_DEVICE_REQUEST; CompleteIrp( pIrp, status, 0 ); } } // &#60- конец оператора "switch" return status; } //=================================================================================




Начало  Назад  Вперед