ReactOS 0.4.15-dev-6056-gb29b268
main.c File Reference
#include "precomp.h"
#include <dispatch.h>
#include <fileobjs.h>
Include dependency graph for main.c:

Go to the source code of this file.

Functions

VOID TiWriteErrorLog (PDRIVER_OBJECT DriverContext, NTSTATUS ErrorCode, ULONG UniqueErrorValue, NTSTATUS FinalStatus, PWSTR String, ULONG DumpDataCount, PULONG DumpData)
 
NTSTATUS TiCreateFileObject (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS TiCloseFileObject (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS NTAPI TiDispatchOpenClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI TiDispatchInternal (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 
NTSTATUS NTAPI TiDispatch (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 Dispatch routine for IRP_MJ_DEVICE_CONTROL requests.
 
VOID NTAPI TiUnload (PDRIVER_OBJECT DriverObject)
 
NTSTATUS NTAPI DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
 
VOID NTAPI IPAddInterface (ULONG Unknown0, ULONG Unknown1, ULONG Unknown2, ULONG Unknown3, ULONG Unknown4)
 
VOID NTAPI IPDelInterface (ULONG Unknown0)
 
VOID NTAPI LookupRoute (ULONG Unknown0, ULONG Unknown1)
 

Variables

PDEVICE_OBJECT TCPDeviceObject = NULL
 
PDEVICE_OBJECT UDPDeviceObject = NULL
 
PDEVICE_OBJECT IPDeviceObject = NULL
 
PDEVICE_OBJECT RawIPDeviceObject = NULL
 
NDIS_HANDLE GlobalPacketPool = NULL
 
NDIS_HANDLE GlobalBufferPool = NULL
 
KSPIN_LOCK EntityListLock
 
TDIEntityInfoEntityList = NULL
 
ULONG EntityCount = 0
 
ULONG EntityMax = 0
 
UDP_STATISTICS UDPStats
 
KTIMER IPTimer
 
KDPC IPTimeoutDpc
 

Function Documentation

◆ DriverEntry()

NTSTATUS NTAPI DriverEntry ( PDRIVER_OBJECT  DriverObject,
PUNICODE_STRING  RegistryPath 
)

Definition at line 626 of file main.c.

637{
644 NDIS_STATUS NdisStatus;
646
647 TI_DbgPrint(MAX_TRACE, ("[TCPIP, DriverEntry] Called\n"));
648
649 /* TdiInitialize() ? */
650
651 /* FIXME: Create symbolic links in Win32 namespace */
652
653 /* Initialize our periodic timer and its associated DPC object. When the
654 timer expires, the IPTimeout deferred procedure call (DPC) is queued */
657
658 /* Create IP device object */
659 Status = IoCreateDevice(DriverObject, 0, &strIpDeviceName,
661 if (!NT_SUCCESS(Status)) {
662 TI_DbgPrint(MIN_TRACE, ("Failed to create IP device object. Status (0x%X).\n", Status));
664 return Status;
665 }
666
668
669 /* Create RawIP device object */
670 Status = IoCreateDevice(DriverObject, 0, &strRawDeviceName,
672 if (!NT_SUCCESS(Status)) {
673 TI_DbgPrint(MIN_TRACE, ("Failed to create RawIP device object. Status (0x%X).\n", Status));
675 return Status;
676 }
677
678 /* Create UDP device object */
679 Status = IoCreateDevice(DriverObject, 0, &strUdpDeviceName,
681 if (!NT_SUCCESS(Status)) {
682 TI_DbgPrint(MIN_TRACE, ("Failed to create UDP device object. Status (0x%X).\n", Status));
684 return Status;
685 }
686
687 /* Create TCP device object */
688 Status = IoCreateDevice(DriverObject, 0, &strTcpDeviceName,
690 if (!NT_SUCCESS(Status)) {
691 TI_DbgPrint(MIN_TRACE, ("Failed to create TCP device object. Status (0x%X).\n", Status));
693 return Status;
694 }
695
696 /* Setup network layer and transport layer entities */
701 if (!EntityList) {
702 TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
705 }
706
707 EntityCount = 0;
709
710 /* Allocate NDIS packet descriptors */
711 NdisAllocatePacketPoolEx(&NdisStatus, &GlobalPacketPool, 500, 1500, sizeof(PACKET_CONTEXT));
712 if (NdisStatus != NDIS_STATUS_SUCCESS) {
715 }
716
717 /* Allocate NDIS buffer descriptors */
718 NdisAllocateBufferPool(&NdisStatus, &GlobalBufferPool, 2000);
719 if (NdisStatus != NDIS_STATUS_SUCCESS) {
722 }
723
724 /* Initialize address file list and protecting spin lock */
727
728 /* Initialize connection endpoint list and protecting spin lock */
731
732 /* Initialize interface list and protecting spin lock */
735
736 /* Initialize network level protocol subsystem */
738
739 /* Initialize transport level protocol subsystems */
741 if( !NT_SUCCESS(Status) ) {
743 return Status;
744 }
745
746 Status = UDPStartup();
747 if( !NT_SUCCESS(Status) ) {
749 return Status;
750 }
751
752 Status = TCPStartup();
753 if( !NT_SUCCESS(Status) ) {
755 return Status;
756 }
757
759 if( !NT_SUCCESS(Status) ) {
761 return Status;
762 }
763
764 /* Use direct I/O */
769
770 /* Initialize the driver object with this driver's entry points */
775
776 DriverObject->DriverUnload = TiUnload;
777
778 /* Open loopback adapter */
780 if (!NT_SUCCESS(Status)) {
781 TI_DbgPrint(MIN_TRACE, ("Failed to create loopback adapter. Status (0x%X).\n", Status));
783 return Status;
784 }
785
786 /* Register protocol with NDIS */
787 /* This used to be IP_DEVICE_NAME but the DDK says it has to match your entry in the SCM */
788 Status = LANRegisterProtocol(&strNdisDeviceName);
789 if (!NT_SUCCESS(Status)) {
790 TI_DbgPrint(MIN_TRACE,("Failed to register protocol with NDIS; status 0x%x\n", Status));
795 Status,
796 NULL,
797 0,
798 NULL);
800 return Status;
801 }
802
803 /* Start the periodic timer with an initial and periodic
804 relative expiration time of IP_TIMEOUT milliseconds */
805 DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000;
807
808 TI_DbgPrint(MAX_TRACE, ("[TCPIP, DriverEntry] Finished\n"));
809
810
811 return STATUS_SUCCESS;
812}
LONG NTSTATUS
Definition: precomp.h:26
#define MIN_TRACE
Definition: debug.h:14
#define MAX_TRACE
Definition: debug.h:16
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
VOID EXPORT NdisAllocateBufferPool(OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE PoolHandle, IN UINT NumberOfDescriptors)
Definition: buffer.c:372
VOID EXPORT NdisAllocatePacketPoolEx(OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE PoolHandle, IN UINT NumberOfDescriptors, IN UINT NumberOfOverflowDescriptors, IN UINT ProtocolReservedLength)
Definition: buffer.c:449
#define TI_DbgPrint(_t_, _x_)
Definition: debug.h:45
NTSTATUS IPStartup(PUNICODE_STRING RegistryPath)
Definition: ip.c:407
KSPIN_LOCK InterfaceListLock
Definition: ip.c:18
#define IP_TIMEOUT
Definition: ip.h:200
LIST_ENTRY InterfaceListHead
Definition: ip.c:17
VOID NTAPI IPTimeoutDpcFn(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
Definition: ip.c:112
#define TDI_ENTITY_TAG
Definition: tags.h:14
NTSTATUS ICMPStartup()
Definition: icmp.c:15
KDPC IPTimeoutDpc
Definition: main.c:30
NDIS_HANDLE GlobalBufferPool
Definition: main.c:21
NTSTATUS NTAPI TiDispatchInternal(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: main.c:374
NTSTATUS NTAPI TiDispatchOpenClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: main.c:333
PDEVICE_OBJECT UDPDeviceObject
Definition: main.c:17
VOID NTAPI TiUnload(PDRIVER_OBJECT DriverObject)
Definition: main.c:560
ULONG EntityMax
Definition: main.c:25
NDIS_HANDLE GlobalPacketPool
Definition: main.c:20
PDEVICE_OBJECT TCPDeviceObject
Definition: main.c:16
NTSTATUS NTAPI TiDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Dispatch routine for IRP_MJ_DEVICE_CONTROL requests.
Definition: main.c:488
VOID TiWriteErrorLog(PDRIVER_OBJECT DriverContext, NTSTATUS ErrorCode, ULONG UniqueErrorValue, NTSTATUS FinalStatus, PWSTR String, ULONG DumpDataCount, PULONG DumpData)
Definition: main.c:32
ULONG EntityCount
Definition: main.c:24
KTIMER IPTimer
Definition: main.c:29
TDIEntityInfo * EntityList
Definition: main.c:23
KSPIN_LOCK EntityListLock
Definition: main.c:22
PDEVICE_OBJECT IPDeviceObject
Definition: main.c:18
PDEVICE_OBJECT RawIPDeviceObject
Definition: main.c:19
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define DO_DIRECT_IO
Definition: env_spec_w32.h:396
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
KSPIN_LOCK AddressFileListLock
Definition: fileobjs.c:22
LIST_ENTRY ConnectionEndpointListHead
Definition: fileobjs.c:25
LIST_ENTRY AddressFileListHead
Definition: fileobjs.c:21
KSPIN_LOCK ConnectionEndpointListLock
Definition: fileobjs.c:26
Status
Definition: gdiplustypes.h:25
NTSTATUS TCPStartup(VOID)
Definition: tcp.c:208
NTSTATUS UDPStartup(VOID)
Definition: udp.c:336
NTSTATUS LANRegisterProtocol(PNDIS_STRING Name)
Registers this protocol driver with NDIS.
Definition: lan.c:893
NDIS_STATUS LoopRegisterAdapter(PNDIS_STRING AdapterName, PLAN_ADAPTER *Adapter)
Definition: loopback.c:96
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
#define EVENT_TRANSPORT_REGISTER_FAILED
Definition: netevent.h:531
int NDIS_STATUS
Definition: ntddndis.h:475
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
#define FILE_DEVICE_NETWORK
Definition: winioctl.h:124
NTSTATUS RawIPStartup(VOID)
Definition: rawip.c:337
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define STATUS_SUCCESS
Definition: shellext.h:65
#define MAX_TDI_ENTITIES
Definition: tdiinfo.h:35
#define TCPIP_PROTOCOL_NAME
Definition: ticonsts.h:32
#define TI_ERROR_DRIVERENTRY
Definition: ticonsts.h:36
#define DD_RAWIP_DEVICE_NAME
Definition: ticonsts.h:27
#define DD_IP_DEVICE_NAME
Definition: ticonsts.h:26
BOOLEAN NTAPI KeSetTimerEx(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN LONG Period, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:294
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
int64_t LONGLONG
Definition: typedefs.h:68
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190
VOID ChewInit(PDEVICE_OBJECT DeviceObject)
Definition: workqueue.c:28
#define DD_UDP_DEVICE_NAME
Definition: wshtcpip.h:28
#define DD_TCP_DEVICE_NAME
Definition: wshtcpip.h:27
#define IRP_MJ_INTERNAL_DEVICE_CONTROL

◆ IPAddInterface()

VOID NTAPI IPAddInterface ( ULONG  Unknown0,
ULONG  Unknown1,
ULONG  Unknown2,
ULONG  Unknown3,
ULONG  Unknown4 
)

Definition at line 815 of file main.c.

821{
823}
#define UNIMPLEMENTED
Definition: debug.h:115

◆ IPDelInterface()

VOID NTAPI IPDelInterface ( ULONG  Unknown0)

Definition at line 827 of file main.c.

829{
831}

◆ LookupRoute()

VOID NTAPI LookupRoute ( ULONG  Unknown0,
ULONG  Unknown1 
)

Definition at line 835 of file main.c.

838{
840}

◆ TiCloseFileObject()

NTSTATUS TiCloseFileObject ( PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 284 of file main.c.

287{
292
294 Context = IrpSp->FileObject->FsContext;
295 if (!Context)
296 {
297 TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n"));
299 }
300
301 switch ((ULONG_PTR)IrpSp->FileObject->FsContext2)
302 {
304 Request.Handle.AddressHandle = Context->Handle.AddressHandle;
306 break;
307
309 Request.Handle.ConnectionContext = Context->Handle.ConnectionContext;
311 break;
312
314 Request.Handle.ControlChannel = Context->Handle.ControlChannel;
316 break;
317
318 default:
320 break;
321 }
322
323 if (NT_SUCCESS(Status))
325
326 Irp->IoStatus.Status = Status;
327
328 return Irp->IoStatus.Status;
329}
_In_ PIRP Irp
Definition: csq.h:116
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
#define TRANS_CONTEXT_TAG
Definition: tags.h:13
NTSTATUS FileCloseConnection(PTDI_REQUEST Request)
Definition: fileobjs.c:667
NTSTATUS FileCloseAddress(PTDI_REQUEST Request)
Definition: fileobjs.c:591
NTSTATUS FileCloseControlChannel(PTDI_REQUEST Request)
Definition: fileobjs.c:738
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
PFILE_OBJECT FileObject
Definition: iotypes.h:3169
#define TDI_CONTROL_CHANNEL_FILE
Definition: tdikrnl.h:67
#define TDI_TRANSPORT_ADDRESS_FILE
Definition: tdikrnl.h:65
#define TDI_CONNECTION_FILE
Definition: tdikrnl.h:66
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793

Referenced by TiDispatchOpenClose().

◆ TiCreateFileObject()

NTSTATUS TiCreateFileObject ( PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 109 of file main.c.

112{
121 BOOLEAN Shared;
122
123 TI_DbgPrint(DEBUG_IRP, ("Called. DeviceObject is at (0x%X), IRP is at (0x%X).\n", DeviceObject, Irp));
124
125 EaInfo = Irp->AssociatedIrp.SystemBuffer;
126
127 /* Parameter check */
128 /* No EA information means that we're opening for SET/QUERY_INFORMATION
129 * style calls. */
130
131 /* Allocate resources here. We release them again if something failed */
134 if (!Context)
135 {
136 TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
138 }
139
140 Context->CancelIrps = FALSE;
141
143 IrpSp->FileObject->FsContext = Context;
144 Request.RequestContext = Irp;
145
146 /* Branch to the right handler */
147 if (EaInfo &&
151 {
152 /* This is a request to open an address */
153
154
155 /* XXX This should probably be done in IoCreateFile() */
156 /* Parameter checks */
157
158 Address = (PTA_IP_ADDRESS)(EaInfo->EaName + EaInfo->EaNameLength + 1); //0-term
159
160 if ((EaInfo->EaValueLength < sizeof(TA_IP_ADDRESS)) ||
161 (Address->TAAddressCount != 1) ||
162 (Address->Address[0].AddressLength < TDI_ADDRESS_LENGTH_IP) ||
163 (Address->Address[0].AddressType != TDI_ADDRESS_TYPE_IP))
164 {
165 TI_DbgPrint(MIN_TRACE, ("Parameters are invalid:\n"));
166 TI_DbgPrint(MIN_TRACE, ("AddressCount: %d\n", Address->TAAddressCount));
167 if( Address->TAAddressCount == 1 )
168 {
169 TI_DbgPrint(MIN_TRACE, ("AddressLength: %u\n",
170 Address->Address[0].AddressLength));
171 TI_DbgPrint(MIN_TRACE, ("AddressType: %u\n",
172 Address->Address[0].AddressType));
173 }
174
177 }
178
179 /* Open address file object */
180
181 /* Protocol depends on device object so find the protocol */
184 else if (DeviceObject == UDPDeviceObject)
186 else if (DeviceObject == IPDeviceObject)
189 {
191 if (!NT_SUCCESS(Status))
192 {
193 TI_DbgPrint(MIN_TRACE, ("Raw IP protocol number is invalid.\n"));
196 }
197 }
198 else
199 {
200 TI_DbgPrint(MIN_TRACE, ("Invalid device object at (0x%X).\n", DeviceObject));
203 }
204
205 Shared = (IrpSp->Parameters.Create.ShareAccess != 0);
206
208 if (NT_SUCCESS(Status))
209 {
211 Context->Handle.AddressHandle = Request.Handle.AddressHandle;
212 }
213
214 }
215 else if (EaInfo &&
218 (&EaInfo->EaName, TdiConnectionContext,
221 {
222 /* This is a request to open a connection endpoint */
223
224 /* Parameter checks */
225
226 if (EaInfo->EaValueLength < sizeof(PVOID))
227 {
228 TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n"));
231 }
232
233 /* Can only do connection oriented communication using TCP */
234
236 {
237 TI_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
240 }
241
242 ClientContext = *((PVOID*)(EaInfo->EaName + EaInfo->EaNameLength));
243
244 /* Open connection endpoint file object */
245
247 if (NT_SUCCESS(Status))
248 {
250 Context->Handle.ConnectionContext = Request.Handle.ConnectionContext;
251 }
252 }
253 else
254 {
255 /* This is a request to open a control connection */
257 if (NT_SUCCESS(Status))
258 {
260 Context->Handle.ControlChannel = Request.Handle.ControlChannel;
261 }
262 }
263
264 if (!NT_SUCCESS(Status))
266
267 TI_DbgPrint(DEBUG_IRP, ("Leaving. Status = (0x%X).\n", Status));
268
269 Irp->IoStatus.Status = Status;
270 return Status;
271}
unsigned char BOOLEAN
#define DEBUG_IRP
Definition: debug.h:19
#define IPPROTO_RAW
Definition: ip.h:192
#define IPPROTO_TCP
Definition: ip.h:196
#define IPPROTO_UDP
Definition: ip.h:197
NTSTATUS TiGetProtocolNumber(PUNICODE_STRING FileName, PULONG Protocol)
Definition: proto.c:3
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
NTSTATUS FileOpenControlChannel(PTDI_REQUEST Request)
Definition: fileobjs.c:694
NTSTATUS FileOpenConnection(PTDI_REQUEST Request, PVOID ClientContext)
Definition: fileobjs.c:632
NTSTATUS FileOpenAddress(PTDI_REQUEST Request, PTA_IP_ADDRESS AddrList, USHORT Protocol, BOOLEAN Shared, PVOID Options)
Definition: fileobjs.c:399
HRESULT Create([out]ITransactionReceiver **ppReceiver)
_In_ PVOID ClientContext
Definition: netioddk.h:55
static WCHAR Address[46]
Definition: ping.c:68
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128
struct _TA_ADDRESS_IP * PTA_IP_ADDRESS
#define TDI_CONNECTION_CONTEXT_LENGTH
Definition: tdi.h:373
#define TDI_TRANSPORT_ADDRESS_LENGTH
Definition: tdi.h:372
#define TDI_ADDRESS_LENGTH_IP
Definition: tdi.h:413
#define TDI_ADDRESS_TYPE_IP
Definition: tdi.h:345
#define TdiConnectionContext
Definition: tdi.h:371
#define TdiTransportAddress
Definition: tdi.h:370
void * PVOID
Definition: typedefs.h:50
uint32_t ULONG
Definition: typedefs.h:59
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055

Referenced by TiDispatchOpenClose().

◆ TiDispatch()

NTSTATUS NTAPI TiDispatch ( PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Dispatch routine for IRP_MJ_DEVICE_CONTROL requests.

Parameters
[in]DeviceObjectPointer to a device object for this driver
[in]IrpPointer to a I/O request packet
Returns
Status of the operation

Definition at line 488 of file main.c.

491{
494
496
497 TI_DbgPrint(DEBUG_IRP, ("[TCPIP, TiDispatch] Called. IRP is at (0x%X).\n", Irp));
498
499 Irp->IoStatus.Information = 0;
500
501#if 0
503 if (NT_SUCCESS(Status))
504 {
507 }
508 else
509 {
510#else
511 if (TRUE) {
512#endif
513 /* See if this request is TCP/IP specific */
514 switch (IrpSp->Parameters.DeviceIoControl.IoControlCode)
515 {
517 TI_DbgPrint(MIN_TRACE, ("TCP_QUERY_INFORMATION_EX\n"));
519 break;
520
522 TI_DbgPrint(MIN_TRACE, ("TCP_SET_INFORMATION_EX\n"));
524 break;
525
527 TI_DbgPrint(MIN_TRACE, ("SET_IP_ADDRESS\n"));
529 break;
530
532 TI_DbgPrint(MIN_TRACE, ("DELETE_IP_ADDRESS\n"));
534 break;
535
537 TI_DbgPrint(MIN_TRACE, ("QUERY_IP_HW_ADDRESS\n"));
539 break;
540
542 TI_DbgPrint(MIN_TRACE, ("ICMP_ECHO_REQUEST\n"));
544 break;
545
546 default:
547 TI_DbgPrint(MIN_TRACE, ("Unknown IOCTL 0x%X\n",
548 IrpSp->Parameters.DeviceIoControl.IoControlCode));
550 break;
551 }
552 }
553
554 TI_DbgPrint(DEBUG_IRP, ("[TCPIP, TiDispatch] Leaving. Status = (0x%X).\n", Status));
555
556 return IRPFinish(Irp, Status);
557}
NTSTATUS DispTdiQueryIpHwAddress(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: dispatch.c:1681
NTSTATUS DispTdiQueryInformationEx(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: dispatch.c:1319
NTSTATUS DispTdiDeleteIPAddress(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: dispatch.c:1609
NTSTATUS DispTdiSetIPAddress(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: dispatch.c:1561
NTSTATUS DispTdiSetInformationEx(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: dispatch.c:1502
NTSTATUS IRPFinish(PIRP Irp, NTSTATUS Status)
Definition: dispatch.c:26
#define TRUE
Definition: types.h:120
NTSTATUS NTAPI TdiMapUserRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp)
Definition: stubs.c:83
NTSTATUS DispEchoRequest(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
#define STATUS_PENDING
Definition: ntstatus.h:82
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
#define IOCTL_SET_IP_ADDRESS
Definition: tcpioctl.h:43
#define IOCTL_DELETE_IP_ADDRESS
Definition: tcpioctl.h:46
#define IOCTL_ICMP_ECHO_REQUEST
Definition: tcpioctl.h:49
#define IOCTL_QUERY_IP_HW_ADDRESS
Definition: tcpioctl.h:40
#define IOCTL_TCP_QUERY_INFORMATION_EX
Definition: tditest.h:110
#define IOCTL_TCP_SET_INFORMATION_EX
Definition: tditest.h:112

Referenced by DriverEntry().

◆ TiDispatchInternal()

NTSTATUS NTAPI TiDispatchInternal ( PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 374 of file main.c.

385{
389
391
392 TI_DbgPrint(DEBUG_IRP, ("[TCPIP, TiDispatchInternal] Called. DeviceObject is at (0x%X), IRP is at (0x%X) MN (%d).\n",
394
395 Irp->IoStatus.Status = STATUS_SUCCESS;
396 Irp->IoStatus.Information = 0;
397
398 switch (IrpSp->MinorFunction) {
399 case TDI_RECEIVE:
401 Complete = FALSE;
402 break;
403
406 Complete = FALSE;
407 break;
408
409 case TDI_SEND:
411 Complete = FALSE; /* Completed in DispTdiSend */
412 break;
413
416 Complete = FALSE;
417 break;
418
419 case TDI_ACCEPT:
421 break;
422
423 case TDI_LISTEN:
425 Complete = FALSE;
426 break;
427
428 case TDI_CONNECT:
430 Complete = FALSE; /* Completed by the TCP event handler */
431 break;
432
433 case TDI_DISCONNECT:
435 Complete = FALSE;
436 break;
437
440 break;
441
444 break;
445
448 break;
449
452 break;
453
456 break;
457
458 case TDI_ACTION:
460 break;
461
462 /* An unsupported IOCTL code was submitted */
463 default:
465 }
466
467 TI_DbgPrint(DEBUG_IRP, ("[TCPIP, TiDispatchInternal] Leaving. Status = (0x%X).\n", Status));
468
469 if( Complete )
470 IRPFinish( Irp, Status );
471
472 return Status;
473}
NTSTATUS DispTdiQueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: dispatch.c:662
NTSTATUS DispTdiAssociateAddress(PIRP Irp)
Definition: dispatch.c:270
NTSTATUS DispTdiConnect(PIRP Irp)
Definition: dispatch.c:382
NTSTATUS DispTdiReceive(PIRP Irp)
Definition: dispatch.c:802
NTSTATUS DispTdiSend(PIRP Irp)
Definition: dispatch.c:945
NTSTATUS DispTdiDisconnect(PIRP Irp)
Definition: dispatch.c:484
NTSTATUS DispTdiSetInformation(PIRP Irp)
Definition: dispatch.c:1266
NTSTATUS DispTdiReceiveDatagram(PIRP Irp)
Definition: dispatch.c:870
NTSTATUS DispTdiSetEventHandler(PIRP Irp)
Definition: dispatch.c:1103
NTSTATUS DispTdiSendDatagram(PIRP Irp)
Definition: dispatch.c:1018
NTSTATUS DispTdiAccept(PIRP Irp)
Definition: dispatch.c:254
NTSTATUS DispTdiDisassociateAddress(PIRP Irp)
Definition: dispatch.c:446
NTSTATUS DispTdiListen(PIRP Irp)
Definition: dispatch.c:550
pRequest Complete(RequestStatus)
#define TDI_SEND_DATAGRAM
Definition: tdikrnl.h:55
#define TDI_RECEIVE_DATAGRAM
Definition: tdikrnl.h:56
#define TDI_ACCEPT
Definition: tdikrnl.h:51
#define TDI_SEND
Definition: tdikrnl.h:53
#define TDI_LISTEN
Definition: tdikrnl.h:50
#define TDI_CONNECT
Definition: tdikrnl.h:49
#define TDI_QUERY_INFORMATION
Definition: tdikrnl.h:58
#define TDI_ACTION
Definition: tdikrnl.h:60
#define TDI_SET_INFORMATION
Definition: tdikrnl.h:59
#define TDI_DISASSOCIATE_ADDRESS
Definition: tdikrnl.h:48
#define TDI_SET_EVENT_HANDLER
Definition: tdikrnl.h:57
#define TDI_RECEIVE
Definition: tdikrnl.h:54
#define TDI_ASSOCIATE_ADDRESS
Definition: tdikrnl.h:47
#define TDI_DISCONNECT
Definition: tdikrnl.h:52
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138

Referenced by DriverEntry(), and TiDispatch().

◆ TiDispatchOpenClose()

NTSTATUS NTAPI TiDispatchOpenClose ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 333 of file main.c.

344{
347
348// DbgPrint("Called. DeviceObject is at (0x%X), IRP is at (0x%X).\n", DeviceObject, Irp);
349
351
352 switch (IrpSp->MajorFunction) {
353 /* Open an address file, connection endpoint, or control connection */
354 case IRP_MJ_CREATE:
356 break;
357
358 /* Close an address file, connection endpoint, or control connection */
359 case IRP_MJ_CLOSE:
361 break;
362
363 default:
365 }
366
367 //DbgPrint("Leaving. Status is (0x%X)\n", Status);
368
369 return IRPFinish( Irp, Status );
370}
NTSTATUS TiCloseFileObject(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: main.c:284
NTSTATUS TiCreateFileObject(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: main.c:109

Referenced by DriverEntry().

◆ TiUnload()

VOID NTAPI TiUnload ( PDRIVER_OBJECT  DriverObject)

Definition at line 560 of file main.c.

567{
568#if DBG
570
573 TI_DbgPrint(MIN_TRACE, ("[TCPIP, TiUnload] Called. Open address file objects exists.\n"));
574 }
576#endif
577 /* Cancel timer */
579
580 /* Unregister loopback adapter */
582
583 /* Unregister protocol with NDIS */
585
586 /* Shutdown transport level protocol subsystems */
587 TCPShutdown();
588 UDPShutdown();
590 ICMPShutdown();
591
592 /* Shutdown network level protocol subsystem */
593 IPShutdown();
594
595 /* Free NDIS buffer descriptors */
598
599 /* Free NDIS packet descriptors */
602
603 /* Release all device objects */
604
605 if (TCPDeviceObject)
607
608 if (UDPDeviceObject)
610
613
614 if (IPDeviceObject) {
615 ChewShutdown();
617 }
618
619 if (EntityList)
621
622 TI_DbgPrint(MAX_TRACE, ("[TCPIP, TiUnload] Leaving.\n"));
623}
VOID EXPORT NdisFreeBufferPool(IN NDIS_HANDLE PoolHandle)
Definition: buffer.c:777
VOID EXPORT NdisFreePacketPool(IN NDIS_HANDLE PoolHandle)
Definition: buffer.c:793
NTSTATUS IPShutdown(VOID)
Definition: ip.c:473
VOID TcpipReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL Irql)
Definition: lock.c:26
VOID TcpipAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL Irql)
Definition: lock.c:18
NTSTATUS ICMPShutdown()
Definition: icmp.c:22
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
UCHAR KIRQL
Definition: env_spec_w32.h:591
NTSTATUS TCPShutdown(VOID)
Definition: tcp.c:243
NTSTATUS UDPShutdown(VOID)
Definition: udp.c:361
VOID LANUnregisterProtocol(VOID)
Unregisters this protocol driver with NDIS.
Definition: lan.c:943
NDIS_STATUS LoopUnregisterAdapter(PLAN_ADAPTER Adapter)
Definition: loopback.c:143
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
NTSTATUS RawIPShutdown(VOID)
Definition: rawip.c:353
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
Definition: timerobj.c:206
VOID ChewShutdown(VOID)
Definition: workqueue.c:36
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:792

Referenced by DriverEntry().

◆ TiWriteErrorLog()

VOID TiWriteErrorLog ( PDRIVER_OBJECT  DriverContext,
NTSTATUS  ErrorCode,
ULONG  UniqueErrorValue,
NTSTATUS  FinalStatus,
PWSTR  String,
ULONG  DumpDataCount,
PULONG  DumpData 
)

Definition at line 32 of file main.c.

52{
53 PIO_ERROR_LOG_PACKET LogEntry;
55 ULONG StringSize;
57 static WCHAR DriverName[] = L"TCP/IP";
58
60 (DumpDataCount * sizeof(ULONG)) + sizeof(DriverName);
61
62 if (String) {
63 StringSize = (wcslen(String) * sizeof(WCHAR)) + sizeof(UNICODE_NULL);
64 EntrySize += (UCHAR)StringSize;
65 }
66
67 /* Fail if the required error log entry is too large */
69 return;
70
72 if (!LogEntry)
73 return;
74
75 LogEntry->MajorFunctionCode = -1;
76 LogEntry->RetryCount = -1;
77 LogEntry->DumpDataSize = (USHORT)(DumpDataCount * sizeof(ULONG));
78 LogEntry->NumberOfStrings = (String == NULL) ? 1 : 2;
79 LogEntry->StringOffset = sizeof(IO_ERROR_LOG_PACKET) + (DumpDataCount * sizeof(ULONG));
80 LogEntry->EventCategory = 0;
81 LogEntry->ErrorCode = ErrorCode;
83 LogEntry->FinalStatus = FinalStatus;
84 LogEntry->SequenceNumber = -1;
85 LogEntry->IoControlCode = 0;
86
87 if (DumpDataCount)
88 RtlCopyMemory(LogEntry->DumpData, DumpData, DumpDataCount * sizeof(ULONG));
89
90 pString = ((PUCHAR)LogEntry) + LogEntry->StringOffset;
91 RtlCopyMemory(pString, DriverName, sizeof(DriverName));
92 pString += sizeof(DriverName);
93
94 if (String)
95 RtlCopyMemory(pString, String, StringSize);
96
97 IoWriteErrorLogEntry(LogEntry);
98}
_In_ ULONG _In_ BOOLEAN _In_ ULONG UniqueErrorValue
Definition: classpnp.h:1312
FxString * pString
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
_In_ NDIS_ERROR_CODE ErrorCode
Definition: ndis.h:4436
#define UNICODE_NULL
VOID NTAPI IoWriteErrorLogEntry(IN PVOID ElEntry)
Definition: error.c:628
PVOID NTAPI IoAllocateErrorLogEntry(IN PVOID IoObject, IN UCHAR EntrySize)
Definition: error.c:528
#define L(x)
Definition: ntvdm.h:50
unsigned short USHORT
Definition: pedump.c:61
NTSTATUS ErrorCode
Definition: iotypes.h:2007
USHORT NumberOfStrings
Definition: iotypes.h:2004
NTSTATUS FinalStatus
Definition: iotypes.h:2009
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
unsigned char * PUCHAR
Definition: typedefs.h:53
_In_ UCHAR _In_ UCHAR _In_ ULONG _In_ WDFCONTEXT DriverContext
Definition: wdfdevice.h:1703
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433
_In_ UCHAR EntrySize
Definition: iofuncs.h:642
#define ERROR_LOG_MAXIMUM_SIZE
Definition: iotypes.h:2042
struct _IO_ERROR_LOG_PACKET * PIO_ERROR_LOG_PACKET
struct _IO_ERROR_LOG_PACKET IO_ERROR_LOG_PACKET
unsigned char UCHAR
Definition: xmlstorage.h:181
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by DriverEntry().

Variable Documentation

◆ EntityCount

◆ EntityList

◆ EntityListLock

◆ EntityMax

ULONG EntityMax = 0

Definition at line 25 of file main.c.

Referenced by DriverEntry().

◆ GlobalBufferPool

NDIS_HANDLE GlobalBufferPool = NULL

Definition at line 21 of file main.c.

Referenced by DriverEntry(), and TiUnload().

◆ GlobalPacketPool

NDIS_HANDLE GlobalPacketPool = NULL

Definition at line 20 of file main.c.

Referenced by DriverEntry(), and TiUnload().

◆ IPDeviceObject

PDEVICE_OBJECT IPDeviceObject = NULL

Definition at line 18 of file main.c.

Referenced by DriverEntry(), TiCreateFileObject(), and TiUnload().

◆ IPTimeoutDpc

KDPC IPTimeoutDpc

Definition at line 30 of file main.c.

Referenced by DriverEntry().

◆ IPTimer

KTIMER IPTimer

Definition at line 29 of file main.c.

Referenced by DriverEntry(), and TiUnload().

◆ RawIPDeviceObject

PDEVICE_OBJECT RawIPDeviceObject = NULL

Definition at line 19 of file main.c.

Referenced by DriverEntry(), TiCreateFileObject(), and TiUnload().

◆ TCPDeviceObject

PDEVICE_OBJECT TCPDeviceObject = NULL

Definition at line 16 of file main.c.

Referenced by DriverEntry(), TCPAllocateConnectionEndpoint(), TiCreateFileObject(), and TiUnload().

◆ UDPDeviceObject

PDEVICE_OBJECT UDPDeviceObject = NULL

Definition at line 17 of file main.c.

Referenced by DriverEntry(), TiCreateFileObject(), and TiUnload().

◆ UDPStats

UDP_STATISTICS UDPStats

Definition at line 26 of file main.c.

Referenced by RawIPStartup(), and UDPStartup().