2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: LGPLv2+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite for TCPIP.sys
5 * PROGRAMMER: Jérôme Gardou <jerome.gardou@reactos.org>
15 _In_ PDEVICE_OBJECT DeviceObject
,
19 UNREFERENCED_PARAMETER(DeviceObject
);
20 UNREFERENCED_PARAMETER(Irp
);
22 KeSetEvent((PKEVENT
)Context
, IO_NETWORK_INCREMENT
, FALSE
);
24 return STATUS_MORE_PROCESSING_REQUIRED
;
29 TestProviderInfo(void)
33 UNICODE_STRING DeviceName
;
34 NTSTATUS CreateStatus
, IrpStatus
;
35 TDI_PROVIDER_INFO ExpectedInfo
;
39 RTL_CONSTANT_STRING(L
"\\Device\\Tcp"),
40 STATUS_SUCCESS
, STATUS_SUCCESS
,
43 0xFFFFFFFF, // MaxSendSize
44 0, // MaxConnectionUserData
45 65507, // MaxDatagramSize
46 TDI_SERVICE_CONNECTION_MODE
|
47 TDI_SERVICE_ORDERLY_RELEASE
|
48 TDI_SERVICE_CONNECTIONLESS_MODE
|
49 TDI_SERVICE_ERROR_FREE_DELIVERY
|
50 TDI_SERVICE_BROADCAST_SUPPORTED
|
51 TDI_SERVICE_DELAYED_ACCEPTANCE
|
52 TDI_SERVICE_EXPEDITED_DATA
|
53 TDI_SERVICE_NO_ZERO_LENGTH
|
54 TDI_SERVICE_DGRAM_CONNECTION
|
55 TDI_SERVICE_FORCE_ACCESS_CHECK
|
56 TDI_SERVICE_SEND_AND_DISCONNECT
|
57 TDI_SERVICE_ACCEPT_LOCAL_ADDR
|
58 TDI_SERVICE_ADDRESS_SECURITY
|
59 TDI_SERVICE_PREPOST_RECVS
|
60 TDI_SERVICE_NO_PUSH
, // ServiceFlags
61 1, // MinimumLookaheadData
62 65535, // MaximumLookaheadData
63 0, // NumberOfResources
68 RTL_CONSTANT_STRING(L
"\\Device\\Udp"),
69 STATUS_SUCCESS
, STATUS_SUCCESS
,
72 0xFFFFFFFF, // MaxSendSize
73 0, // MaxConnectionUserData
74 65507, // MaxDatagramSize
75 TDI_SERVICE_CONNECTION_MODE
|
76 TDI_SERVICE_ORDERLY_RELEASE
|
77 TDI_SERVICE_CONNECTIONLESS_MODE
|
78 TDI_SERVICE_ERROR_FREE_DELIVERY
|
79 TDI_SERVICE_BROADCAST_SUPPORTED
|
80 TDI_SERVICE_DELAYED_ACCEPTANCE
|
81 TDI_SERVICE_EXPEDITED_DATA
|
82 TDI_SERVICE_NO_ZERO_LENGTH
|
83 TDI_SERVICE_DGRAM_CONNECTION
|
84 TDI_SERVICE_FORCE_ACCESS_CHECK
|
85 TDI_SERVICE_SEND_AND_DISCONNECT
|
86 TDI_SERVICE_ACCEPT_LOCAL_ADDR
|
87 TDI_SERVICE_ADDRESS_SECURITY
|
88 TDI_SERVICE_PREPOST_RECVS
|
89 TDI_SERVICE_NO_PUSH
, // ServiceFlags
90 1, // MinimumLookaheadData
91 65535, // MaximumLookaheadData
92 0, // NumberOfResources
97 RTL_CONSTANT_STRING(L
"\\Device\\Ip"),
98 STATUS_SUCCESS
, STATUS_NOT_IMPLEMENTED
,
101 RTL_CONSTANT_STRING(L
"\\Device\\RawIp"),
102 STATUS_SUCCESS
, STATUS_SUCCESS
,
105 0xFFFFFFFF, // MaxSendSize
106 0, // MaxConnectionUserData
107 65507, // MaxDatagramSize
108 TDI_SERVICE_CONNECTION_MODE
|
109 TDI_SERVICE_ORDERLY_RELEASE
|
110 TDI_SERVICE_CONNECTIONLESS_MODE
|
111 TDI_SERVICE_ERROR_FREE_DELIVERY
|
112 TDI_SERVICE_BROADCAST_SUPPORTED
|
113 TDI_SERVICE_DELAYED_ACCEPTANCE
|
114 TDI_SERVICE_EXPEDITED_DATA
|
115 TDI_SERVICE_NO_ZERO_LENGTH
|
116 TDI_SERVICE_DGRAM_CONNECTION
|
117 TDI_SERVICE_FORCE_ACCESS_CHECK
|
118 TDI_SERVICE_SEND_AND_DISCONNECT
|
119 TDI_SERVICE_ACCEPT_LOCAL_ADDR
|
120 TDI_SERVICE_ADDRESS_SECURITY
|
121 TDI_SERVICE_PREPOST_RECVS
|
122 TDI_SERVICE_NO_PUSH
, // ServiceFlags
123 1, // MinimumLookaheadData
124 65535, // MaximumLookaheadData
125 0, // NumberOfResources
130 RTL_CONSTANT_STRING(L
"\\Device\\IPMULTICAST"),
131 STATUS_SUCCESS
, STATUS_INVALID_PARAMETER
,
136 for (i
= 0; i
< (sizeof(TestData
) / sizeof(TestData
[0])); i
++)
138 IO_STATUS_BLOCK StatusBlock
;
140 FILE_OBJECT
* FileObject
;
141 DEVICE_OBJECT
* DeviceObject
;
145 TDI_PROVIDER_INFO
* ProviderInfo
;
147 OBJECT_ATTRIBUTES ObjectAttributes
;
149 trace("Testing device %wZ\n", &TestData
[i
].DeviceName
);
151 InitializeObjectAttributes(
153 &TestData
[i
].DeviceName
,
154 OBJ_KERNEL_HANDLE
| OBJ_CASE_INSENSITIVE
,
158 Status
= ZwCreateFile(
160 FILE_READ_DATA
| FILE_WRITE_DATA
,
164 FILE_ATTRIBUTE_NORMAL
,
165 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
170 ok_eq_hex(Status
, TestData
[i
].CreateStatus
);
171 if (!NT_SUCCESS(Status
))
174 Status
= ObReferenceObjectByHandle(
181 ok_eq_hex(Status
, STATUS_SUCCESS
);
182 if (!NT_SUCCESS(Status
))
185 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
186 ok(DeviceObject
!= NULL
, "Device object is NULL!\n");
189 ObDereferenceObject(FileObject
);
193 ProviderInfo
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(*ProviderInfo
), 'tseT');
194 ok(ProviderInfo
!= NULL
, "Ran out of memory.\n");
197 ObDereferenceObject(FileObject
);
201 Mdl
= IoAllocateMdl(ProviderInfo
, sizeof(*ProviderInfo
), FALSE
, FALSE
, NULL
);
202 ok(Mdl
!= NULL
, "Could not allocate the MDL!\n");
205 ExFreePoolWithTag(ProviderInfo
, 'tseT');
206 ObDereferenceObject(FileObject
);
210 MmBuildMdlForNonPagedPool(Mdl
);
213 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
214 Irp
= IoAllocateIrp(DeviceObject
->StackSize
, FALSE
);
215 ok(Irp
!= NULL
, "TdiBuildInternalDeviceControlIrp returned NULL!\n");
219 ExFreePoolWithTag(ProviderInfo
, 'tseT');
220 ObDereferenceObject(FileObject
);
224 TdiBuildQueryInformation(
230 TDI_QUERY_PROVIDER_INFO
,
233 IoSetCompletionRoutine(Irp
, IrpCompletionRoutine
, &Event
, TRUE
, TRUE
, TRUE
);
235 Status
= IoCallDriver(DeviceObject
, Irp
);
236 if (Status
== STATUS_PENDING
)
238 KeWaitForSingleObject(
244 Status
= StatusBlock
.Status
;
246 ok_eq_hex(Status
, TestData
[i
].IrpStatus
);
250 ObDereferenceObject(FileObject
);
252 if (!NT_SUCCESS(Status
))
254 ExFreePoolWithTag(ProviderInfo
, 'tseT');
258 ok_eq_hex(ProviderInfo
->Version
, TestData
[i
].ExpectedInfo
.Version
);
259 ok_eq_ulong(ProviderInfo
->MaxSendSize
, TestData
[i
].ExpectedInfo
.MaxSendSize
);
260 ok_eq_ulong(ProviderInfo
->MaxConnectionUserData
, TestData
[i
].ExpectedInfo
.MaxConnectionUserData
);
261 ok_eq_ulong(ProviderInfo
->MaxDatagramSize
, TestData
[i
].ExpectedInfo
.MaxDatagramSize
);
262 ok_eq_hex(ProviderInfo
->ServiceFlags
, TestData
[i
].ExpectedInfo
.ServiceFlags
);
263 ok_eq_ulong(ProviderInfo
->MinimumLookaheadData
, TestData
[i
].ExpectedInfo
.MinimumLookaheadData
);
264 ok_eq_ulong(ProviderInfo
->MaximumLookaheadData
, TestData
[i
].ExpectedInfo
.MaximumLookaheadData
);
265 ok_eq_ulong(ProviderInfo
->NumberOfResources
, TestData
[i
].ExpectedInfo
.NumberOfResources
);
267 ExFreePoolWithTag(ProviderInfo
, 'tseT');
271 static KSTART_ROUTINE RunTest
;
278 UNREFERENCED_PARAMETER(Context
);
283 KMT_MESSAGE_HANDLER TestTdi
;
286 _In_ PDEVICE_OBJECT DeviceObject
,
287 _In_ ULONG ControlCode
,
288 _In_opt_ PVOID Buffer
,
289 _In_ SIZE_T InLength
,
290 _Inout_ PSIZE_T OutLength
295 Thread
= KmtStartThread(RunTest
, NULL
);
296 KmtFinishThread(Thread
, NULL
);
298 return STATUS_SUCCESS
;