--- /dev/null
+/* Copyright mellanox */\r
+\r
+extern "C" {\r
+#include <NTDDK.h>\r
+}\r
+#include "sdpdriver.h"\r
+#include "SdpLib.h"\r
+#include "SdpTrace.h"\r
+\r
+NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);\r
+\r
+VOID DriverUnload (\r
+ IN PDRIVER_OBJECT pDriverObject \r
+ ) \r
+{\r
+ SDP_PRINT(SDP_TRACE, SDP_DRIVER, ("DriverUnload called pDriverObject = 0x%x\n", pDriverObject ));\r
+\r
+ SdpDriver *pSdpDriver;\r
+ UNICODE_STRING LinkName;\r
+\r
+ pSdpDriver = (SdpDriver *) pDriverObject->DeviceObject->DeviceExtension;\r
+\r
+\r
+ RtlInitUnicodeString( &LinkName, SDP_LINK_NAME );\r
+ IoDeleteSymbolicLink(&LinkName);\r
+\r
+ IoDeleteDevice( pSdpDriver->GetDeviceObject());\r
+}\r
+\r
+\r
+\r
+extern "C" NTSTATUS DriverEntry (\r
+ IN PDRIVER_OBJECT pDriverObject,\r
+ IN PUNICODE_STRING pRegistryPath )\r
+{\r
+ NTSTATUS rc;\r
+ PDEVICE_OBJECT pDevObj;\r
+ SdpDriver *pSdpDriver;\r
+ bool DeviceCreated = false;\r
+ UNICODE_STRING DevName, LinkName;\r
+ int i;\r
+\r
+ SDP_PRINT(SDP_TRACE, SDP_DRIVER, ("DriverEntry called\n" ));\r
+\r
+ // fill the device functions\r
+ pDriverObject->DriverUnload = DriverUnload;\r
+ pDriverObject->FastIoDispatch = NULL;\r
+ pDriverObject->DriverStartIo = NULL;\r
+ for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {\r
+ pDriverObject->MajorFunction[i] = SdpDriver::Dispatch;\r
+ }\r
+\r
+\r
+\r
+ // Create the device that will be used for comunication with the user mode\r
+ // Now create the device\r
+\r
+ RtlInitUnicodeString( &DevName, SDP_DEVICE_NAME );\r
+ RtlInitUnicodeString( &LinkName, SDP_LINK_NAME );\r
+\r
+ \r
+ // BUGBUG: Should we crearte a secure device object \r
+ rc = IoCreateDevice( pDriverObject,\r
+ sizeof(SdpDriver),\r
+ &DevName,\r
+ FILE_DEVICE_UNKNOWN,\r
+ 0, \r
+ TRUE,\r
+ &pDevObj );\r
+ if (!NT_SUCCESS(rc)) {\r
+ SDP_PRINT(SDP_ERR, SDP_DRIVER, ("IoCreateDevice failed rc = 0x%x\n", rc )); \r
+ goto Cleanup;\r
+ }\r
+ DeviceCreated = true;\r
+\r
+ pSdpDriver = (SdpDriver *) pDevObj->DeviceExtension;\r
+ rc = pSdpDriver->Init(pDevObj);\r
+\r
+ if (!NT_SUCCESS(rc)) {\r
+ SDP_PRINT(SDP_ERR, SDP_DRIVER, ("pSdpDriver->Init failed rc = 0x%x\n", rc ));\r
+ goto Cleanup;\r
+ }\r
+\r
+\r
+ // Create a Win32-accessible device object\r
+ rc = IoCreateSymbolicLink(\r
+ &LinkName,\r
+ &DevName \r
+ );\r
+\r
+ if (!NT_SUCCESS(rc)) {\r
+ SDP_PRINT(SDP_ERR, SDP_DRIVER, ("IoCreateSymbolicLink failed rc = 0x%x\n", rc ));\r
+ goto Cleanup;\r
+ }\r
+\r
+Cleanup:\r
+ if (!NT_SUCCESS(rc)) {\r
+ if ( DeviceCreated ) {\r
+ IoDeleteDevice(pDevObj);\r
+ }\r
+ }\r
+ return rc;\r
+\r
+}\r
+\r
+\r
+NTSTATUS SdpDriver::Dispatch(\r
+ IN PDEVICE_OBJECT pDeviceObject,\r
+ IN PIRP pIrp\r
+ )\r
+{\r
+ NTSTATUS rc = STATUS_SUCCESS;\r
+ PIO_STACK_LOCATION pIrpSp;\r
+ pIrp->IoStatus.Status = STATUS_SUCCESS;\r
+ pIrp->IoStatus.Information = 0;\r
+\r
+\r
+ pIrpSp = IoGetCurrentIrpStackLocation(pIrp);\r
+\r
+ switch (pIrpSp->MajorFunction) {\r
+\r
+ case IRP_MJ_CREATE: {\r
+ SDP_PRINT(SDP_TRACE, SDP_DRIVER, ("IRP_MJ_CREATE pIrpSp->FileObject = 0x%x\n", \r
+ pIrpSp->FileObject ));\r
+\r
+ break;\r
+ }\r
+ case IRP_MJ_CLEANUP: {\r
+ // All IRPs that were associated with this device should be cleaned\r
+ SDP_PRINT(SDP_TRACE, SDP_DRIVER, ("IRP_MJ_CLEANUP pIrpSp->FileObject = 0x%x\n", \r
+ pIrpSp->FileObject ));\r
+ break;\r
+\r
+ }\r
+\r
+ case IRP_MJ_CLOSE: { \r
+ // Receipt of this request indicates that the last handle of the file object \r
+ // that is associated with the target device object has been closed and \r
+ //released. All outstanding I/O requests have been completed or canceled.\r
+ SDP_PRINT(SDP_TRACE, SDP_DRIVER, ("IRP_MJ_CLOSE pIrpSp->FileObject = 0x%x\n", \r
+ pIrpSp->FileObject ));\r
+\r
+ break;\r
+ }\r
+ case IRP_MJ_DEVICE_CONTROL: {\r
+ SDP_PRINT(SDP_TRACE, SDP_DRIVER, ("IRP_MJ_DEVICE_CONTROL pIrpSp->FileObject = 0x%x\n", \r
+ pIrpSp->FileObject ));\r
+\r
+ // IOCTLs are allowed only for user mode processes\r
+ if (UserMode != pIrp->RequestorMode) {\r
+ rc = STATUS_ACCESS_DENIED;\r
+ break;\r
+ }\r
+\r
+ // Handle the mode of the request and get it's params\r
+\r
+\r
+ // Handle the request itslef\r
+ } \r
+ }\r
+\r
+ return rc;\r
+}\r
+\r