Sync with trunk r63935.
[reactos.git] / drivers / network / ndisuio / main.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS User I/O driver
4 * FILE: main.c
5 * PURPOSE: Driver entry point and protocol initialization
6 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
7 */
8
9 #include "ndisuio.h"
10
11 //#define NDEBUG
12 #include <debug.h>
13
14 PDEVICE_OBJECT GlobalDeviceObject;
15 NDIS_HANDLE GlobalProtocolHandle;
16 KSPIN_LOCK GlobalAdapterListLock;
17 LIST_ENTRY GlobalAdapterList;
18
19 NDIS_STRING ProtocolName = RTL_CONSTANT_STRING(L"NDISUIO");
20
21 VOID NTAPI NduUnload(PDRIVER_OBJECT DriverObject)
22 {
23 DPRINT("NDISUIO: Unloaded\n");
24 }
25
26 NTSTATUS
27 NTAPI
28 DriverEntry(PDRIVER_OBJECT DriverObject,
29 PUNICODE_STRING RegistryPath)
30 {
31 NDIS_STATUS Status;
32 NDIS_PROTOCOL_CHARACTERISTICS Chars;
33 UNICODE_STRING NtDeviceName = RTL_CONSTANT_STRING(NDISUIO_DEVICE_NAME_NT);
34 UNICODE_STRING DosDeviceName = RTL_CONSTANT_STRING(NDISUIO_DEVICE_NAME_DOS);
35
36 /* Setup dispatch functions */
37 DriverObject->MajorFunction[IRP_MJ_CREATE] = NduDispatchCreate;
38 DriverObject->MajorFunction[IRP_MJ_CLOSE] = NduDispatchClose;
39 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NduDispatchDeviceControl;
40 DriverObject->MajorFunction[IRP_MJ_READ] = NduDispatchRead;
41 DriverObject->MajorFunction[IRP_MJ_WRITE] = NduDispatchWrite;
42 DriverObject->DriverUnload = NduUnload;
43
44 /* Setup global state */
45 InitializeListHead(&GlobalAdapterList);
46 KeInitializeSpinLock(&GlobalAdapterListLock);
47
48 /* Create the NDISUIO device object */
49 Status = IoCreateDevice(DriverObject,
50 0,
51 &NtDeviceName,
52 FILE_DEVICE_SECURE_OPEN,
53 0,
54 FALSE,
55 &GlobalDeviceObject);
56 if (!NT_SUCCESS(Status))
57 {
58 DPRINT1("Failed to create device object with status 0x%x\n", Status);
59 return Status;
60 }
61
62 /* Create a symbolic link into the DOS devices namespace */
63 Status = IoCreateSymbolicLink(&DosDeviceName, &NtDeviceName);
64 if (!NT_SUCCESS(Status))
65 {
66 DPRINT1("Failed to create symbolic link with status 0x%x\n", Status);
67 IoDeleteDevice(GlobalDeviceObject);
68 return Status;
69 }
70
71 /* Register the protocol with NDIS */
72 RtlZeroMemory(&Chars, sizeof(Chars));
73 Chars.MajorNdisVersion = NDIS_MAJOR_VERSION;
74 Chars.MinorNdisVersion = NDIS_MINOR_VERSION;
75 Chars.OpenAdapterCompleteHandler = NduOpenAdapterComplete;
76 Chars.CloseAdapterCompleteHandler = NduCloseAdapterComplete;
77 Chars.PnPEventHandler = NduNetPnPEvent;
78 Chars.SendCompleteHandler = NduSendComplete;
79 Chars.TransferDataCompleteHandler = NduTransferDataComplete;
80 Chars.ResetCompleteHandler = NduResetComplete;
81 Chars.RequestCompleteHandler = NduRequestComplete;
82 Chars.ReceiveHandler = NduReceive;
83 Chars.ReceiveCompleteHandler = NduReceiveComplete;
84 Chars.StatusHandler = NduStatus;
85 Chars.StatusCompleteHandler = NduStatusComplete;
86 Chars.Name = ProtocolName;
87 Chars.BindAdapterHandler = NduBindAdapter;
88 Chars.UnbindAdapterHandler = NduUnbindAdapter;
89
90 NdisRegisterProtocol(&Status,
91 &GlobalProtocolHandle,
92 &Chars,
93 sizeof(Chars));
94 if (Status != NDIS_STATUS_SUCCESS)
95 {
96 DPRINT1("Failed to register protocol with status 0x%x\n", Status);
97 IoDeleteSymbolicLink(&DosDeviceName);
98 IoDeleteDevice(GlobalDeviceObject);
99 return Status;
100 }
101
102 DPRINT("NDISUIO: Loaded\n");
103
104 return STATUS_SUCCESS;
105 }