MCPcopy Create free account
hub / github.com/HoShiMin/Kernel-Bridge / DriverControl

Function DriverControl

Kernel-Bridge/Kernel-Bridge.cpp:271–315  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

269_Function_class_(DRIVER_DISPATCH)
270_Dispatch_type_(IRP_MJ_DEVICE_CONTROL)
271static NTSTATUS DriverControl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
272{
273 UNREFERENCED_PARAMETER(DeviceObject);
274
275 PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
276
277 IOCTL_INFO RequestInfo;
278 RequestInfo.ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
279 switch (EXTRACT_CTL_METHOD(RequestInfo.ControlCode)) {
280 case METHOD_BUFFERED: {
281 RequestInfo.InputBuffer = Irp->AssociatedIrp.SystemBuffer;
282 RequestInfo.OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
283 RequestInfo.InputBufferSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
284 RequestInfo.OutputBufferSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
285 Irp->IoStatus.Status = CallIoctlDispatcher(&RequestInfo, &Irp->IoStatus.Information);
286 break;
287 }
288 case METHOD_NEITHER: {
289 RequestInfo.InputBuffer = IrpStack->Parameters.DeviceIoControl.Type3InputBuffer;
290 RequestInfo.OutputBuffer = Irp->UserBuffer;
291 RequestInfo.InputBufferSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
292 RequestInfo.OutputBufferSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
293 Irp->IoStatus.Status = CallIoctlDispatcher(&RequestInfo, &Irp->IoStatus.Information);
294 break;
295 }
296 case METHOD_IN_DIRECT:
297 case METHOD_OUT_DIRECT: {
298 RequestInfo.InputBuffer = Irp->AssociatedIrp.SystemBuffer;
299 RequestInfo.OutputBuffer = Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : NULL;
300 RequestInfo.InputBufferSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
301 RequestInfo.OutputBufferSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
302 Irp->IoStatus.Status = CallIoctlDispatcher(&RequestInfo, &Irp->IoStatus.Information);
303 break;
304 }
305 default: {
306 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
307 KdPrint(("[Kernel-Bridge]: Unknown method of IRP!\r\n"));
308 }
309 }
310
311 NTSTATUS Status = Irp->IoStatus.Status;
312 IoCompleteRequest(Irp, IO_NO_INCREMENT);
313
314 return Status;
315}
316
317_Function_class_(DRIVER_DISPATCH)
318_Dispatch_type_(IRP_MJ_CREATE)

Callers

nothing calls this directly

Calls 1

CallIoctlDispatcherFunction · 0.85

Tested by

no test coverage detected