NTSTATUS DriverEntry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath) { NTSTATUS ntStatus; UNICODE_STRING ntUnicodeString; UNICODE_STRING ntWin32NameString; PDEVICE_OBJECT deviceObject = NULL; // pointer to the instanced device object // PDEVICE_DESCRIPTION devDes; UNREFERENCED_PARAMETER(RegistryPath); UNREFERENCED_PARAMETER(deviceObject); RtlInitUnicodeString(&ntUnicodeString, NETMAP_NT_DEVICE_NAME); ntStatus = IoCreateDevice( DriverObject, // The Driver Object 0, // DeviceExtensionSize &ntUnicodeString, // DeviceName FILE_DEVICE_UNKNOWN, // Device type FILE_DEVICE_SECURE_OPEN, // Device characteristics FALSE, // Not exclusive &deviceObject ); // Returned pointer to the device if ( !NT_SUCCESS( ntStatus ) ) { DbgPrint("NETMAP.SYS: Couldn't create the device object\n"); return ntStatus; } DbgPrint("NETMAP.SYS: Driver loaded at address 0x%p \n",&deviceObject); // Init function pointers to major driver functions DriverObject->MajorFunction[IRP_MJ_CREATE] = ioctlCreate; DriverObject->MajorFunction[IRP_MJ_CLOSE] = ioctlClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ioctlDeviceControl; DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ioctlInternalDeviceControl; //DriverObject->MajorFunction[IRP_MJ_READ] = ReadSync; //DriverObject->MajorFunction[IRP_MJ_WRITE] = WriteSync; DriverObject->DriverUnload = ioctlUnloadDriver; // Initialize a Unicode String containing the Win32 name // for our device. RtlInitUnicodeString(&ntWin32NameString, NETMAP_DOS_DEVICE_NAME); // Symlink creation ntStatus = IoCreateSymbolicLink(&ntWin32NameString, &ntUnicodeString ); if (netmap_init() != 0) { DbgPrint("NETMAP.SYS: Netmap init FAILED!!!\n"); ntStatus = STATUS_DEVICE_INSUFFICIENT_RESOURCES; } if ( !NT_SUCCESS( ntStatus ) ) { //Clear all in case of not success DbgPrint("NETMAP.SYS: Couldn't create driver\n"); IoDeleteDevice( deviceObject ); } else { keinit_GST(); deviceObject->Flags |= DO_DIRECT_IO; } return ntStatus; }
/* * Kernel entry point. * * Initialize/finalize the module and return. * * Return 0 on success, errno on failure. */ static int netmap_loader(__unused struct module *module, int event, __unused void *arg) { int error = 0; switch (event) { case MOD_LOAD: error = netmap_init(); break; case MOD_UNLOAD: netmap_fini(); break; default: error = EOPNOTSUPP; break; } return (error); }