/* Network timers */
KTIMER IPTimer;
KDPC IPTimeoutDpc;
-KSPIN_LOCK IpWorkLock;
-WORK_QUEUE_ITEM IpWorkItem;
VOID TiWriteErrorLog(
PDRIVER_OBJECT DriverContext,
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
- PFILE_FULL_EA_INFORMATION EaInfo;
- PTRANSPORT_CONTEXT Context;
- PIO_STACK_LOCATION IrpSp;
- PTA_IP_ADDRESS Address;
- TDI_REQUEST Request;
- PVOID ClientContext;
- NTSTATUS Status;
- ULONG Protocol;
-
- TI_DbgPrint(DEBUG_IRP, ("Called. DeviceObject is at (0x%X), IRP is at (0x%X).\n", DeviceObject, Irp));
-
- EaInfo = Irp->AssociatedIrp.SystemBuffer;
-
- /* Parameter check */
- /* No EA information means that we're opening for SET/QUERY_INFORMATION
- * style calls. */
-
- /* Allocate resources here. We release them again if something failed */
- Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(TRANSPORT_CONTEXT),
- TRANS_CONTEXT_TAG);
- if (!Context) {
- TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- Context->CancelIrps = FALSE;
-
- IrpSp = IoGetCurrentIrpStackLocation(Irp);
- IrpSp->FileObject->FsContext = Context;
- Request.RequestContext = Irp;
-
- /* Branch to the right handler */
- if (EaInfo &&
- (EaInfo->EaNameLength == TDI_TRANSPORT_ADDRESS_LENGTH) &&
- (RtlCompareMemory
- (&EaInfo->EaName, TdiTransportAddress,
- TDI_TRANSPORT_ADDRESS_LENGTH) == TDI_TRANSPORT_ADDRESS_LENGTH)) {
- /* This is a request to open an address */
-
-
- /* XXX This should probably be done in IoCreateFile() */
- /* Parameter checks */
-
- Address = (PTA_IP_ADDRESS)(EaInfo->EaName + EaInfo->EaNameLength + 1); //0-term
-
- if ((EaInfo->EaValueLength < sizeof(TA_IP_ADDRESS)) ||
- (Address->TAAddressCount != 1) ||
- (Address->Address[0].AddressLength < TDI_ADDRESS_LENGTH_IP) ||
- (Address->Address[0].AddressType != TDI_ADDRESS_TYPE_IP)) {
- TI_DbgPrint(MIN_TRACE, ("Parameters are invalid:\n"));
- TI_DbgPrint(MIN_TRACE, ("AddressCount: %d\n", Address->TAAddressCount));
- if( Address->TAAddressCount == 1 ) {
- TI_DbgPrint(MIN_TRACE, ("AddressLength: %\n",
- Address->Address[0].AddressLength));
- TI_DbgPrint(MIN_TRACE, ("AddressType: %\n",
- Address->Address[0].AddressType));
- }
- ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
- return STATUS_INVALID_PARAMETER;
- }
-
- /* Open address file object */
-
- /* Protocol depends on device object so find the protocol */
- if (DeviceObject == TCPDeviceObject)
- Protocol = IPPROTO_TCP;
- else if (DeviceObject == UDPDeviceObject)
- Protocol = IPPROTO_UDP;
- else if (DeviceObject == IPDeviceObject)
- Protocol = IPPROTO_RAW;
- else if (DeviceObject == RawIPDeviceObject) {
- Status = TiGetProtocolNumber(&IrpSp->FileObject->FileName, &Protocol);
- if (!NT_SUCCESS(Status)) {
- TI_DbgPrint(MIN_TRACE, ("Raw IP protocol number is invalid.\n"));
- ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
- return STATUS_INVALID_PARAMETER;
- }
- } else {
- TI_DbgPrint(MIN_TRACE, ("Invalid device object at (0x%X).\n", DeviceObject));
- ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
- return STATUS_INVALID_PARAMETER;
- }
-
- Status = FileOpenAddress(&Request, Address, Protocol, NULL);
- if (NT_SUCCESS(Status)) {
- IrpSp->FileObject->FsContext2 = (PVOID)TDI_TRANSPORT_ADDRESS_FILE;
- Context->Handle.AddressHandle = Request.Handle.AddressHandle;
- }
-
- } else if (EaInfo &&
- (EaInfo->EaNameLength == TDI_CONNECTION_CONTEXT_LENGTH) &&
- (RtlCompareMemory
- (&EaInfo->EaName, TdiConnectionContext,
- TDI_CONNECTION_CONTEXT_LENGTH) ==
- TDI_CONNECTION_CONTEXT_LENGTH)) {
- /* This is a request to open a connection endpoint */
-
- /* Parameter checks */
-
- if (EaInfo->EaValueLength < sizeof(PVOID)) {
- TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n"));
- ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
- return STATUS_INVALID_PARAMETER;
+ PFILE_FULL_EA_INFORMATION EaInfo;
+ PTRANSPORT_CONTEXT Context;
+ PIO_STACK_LOCATION IrpSp;
+ PTA_IP_ADDRESS Address;
+ TDI_REQUEST Request;
+ PVOID ClientContext;
+ NTSTATUS Status;
+ ULONG Protocol;
+
+ TI_DbgPrint(DEBUG_IRP, ("Called. DeviceObject is at (0x%X), IRP is at (0x%X).\n", DeviceObject, Irp));
+
+ EaInfo = Irp->AssociatedIrp.SystemBuffer;
+
+ /* Parameter check */
+ /* No EA information means that we're opening for SET/QUERY_INFORMATION
+ * style calls. */
+
+ /* Allocate resources here. We release them again if something failed */
+ Context = ExAllocatePoolWithTag(NonPagedPool, sizeof(TRANSPORT_CONTEXT),
+ TRANS_CONTEXT_TAG);
+ if (!Context)
+ {
+ TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+ return STATUS_INSUFFICIENT_RESOURCES;
}
- /* Can only do connection oriented communication using TCP */
+ Context->CancelIrps = FALSE;
+
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+ IrpSp->FileObject->FsContext = Context;
+ Request.RequestContext = Irp;
+
+ /* Branch to the right handler */
+ if (EaInfo &&
+ (EaInfo->EaNameLength == TDI_TRANSPORT_ADDRESS_LENGTH) &&
+ (RtlCompareMemory(&EaInfo->EaName, TdiTransportAddress,
+ TDI_TRANSPORT_ADDRESS_LENGTH) == TDI_TRANSPORT_ADDRESS_LENGTH))
+ {
+ /* This is a request to open an address */
+
+
+ /* XXX This should probably be done in IoCreateFile() */
+ /* Parameter checks */
+
+ Address = (PTA_IP_ADDRESS)(EaInfo->EaName + EaInfo->EaNameLength + 1); //0-term
+
+ if ((EaInfo->EaValueLength < sizeof(TA_IP_ADDRESS)) ||
+ (Address->TAAddressCount != 1) ||
+ (Address->Address[0].AddressLength < TDI_ADDRESS_LENGTH_IP) ||
+ (Address->Address[0].AddressType != TDI_ADDRESS_TYPE_IP))
+ {
+ TI_DbgPrint(MIN_TRACE, ("Parameters are invalid:\n"));
+ TI_DbgPrint(MIN_TRACE, ("AddressCount: %d\n", Address->TAAddressCount));
+ if( Address->TAAddressCount == 1 )
+ {
+ TI_DbgPrint(MIN_TRACE, ("AddressLength: %\n",
+ Address->Address[0].AddressLength));
+ TI_DbgPrint(MIN_TRACE, ("AddressType: %\n",
+ Address->Address[0].AddressType));
+ }
+
+ ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Open address file object */
+
+ /* Protocol depends on device object so find the protocol */
+ if (DeviceObject == TCPDeviceObject)
+ Protocol = IPPROTO_TCP;
+ else if (DeviceObject == UDPDeviceObject)
+ Protocol = IPPROTO_UDP;
+ else if (DeviceObject == IPDeviceObject)
+ Protocol = IPPROTO_RAW;
+ else if (DeviceObject == RawIPDeviceObject)
+ {
+ Status = TiGetProtocolNumber(&IrpSp->FileObject->FileName, &Protocol);
+ if (!NT_SUCCESS(Status))
+ {
+ TI_DbgPrint(MIN_TRACE, ("Raw IP protocol number is invalid.\n"));
+ ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
+ return STATUS_INVALID_PARAMETER;
+ }
+ }
+ else
+ {
+ TI_DbgPrint(MIN_TRACE, ("Invalid device object at (0x%X).\n", DeviceObject));
+ ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ Status = FileOpenAddress(&Request, Address, Protocol, NULL);
+ if (NT_SUCCESS(Status))
+ {
+ IrpSp->FileObject->FsContext2 = (PVOID)TDI_TRANSPORT_ADDRESS_FILE;
+ Context->Handle.AddressHandle = Request.Handle.AddressHandle;
+ }
- if (DeviceObject != TCPDeviceObject) {
- TI_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
- ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
- return STATUS_INVALID_PARAMETER;
}
-
- ClientContext = *((PVOID*)(EaInfo->EaName + EaInfo->EaNameLength));
-
- /* Open connection endpoint file object */
-
- Status = FileOpenConnection(&Request, ClientContext);
- if (NT_SUCCESS(Status)) {
- IrpSp->FileObject->FsContext2 = (PVOID)TDI_CONNECTION_FILE;
- Context->Handle.ConnectionContext = Request.Handle.ConnectionContext;
+ else if (EaInfo &&
+ (EaInfo->EaNameLength == TDI_CONNECTION_CONTEXT_LENGTH) &&
+ (RtlCompareMemory
+ (&EaInfo->EaName, TdiConnectionContext,
+ TDI_CONNECTION_CONTEXT_LENGTH) ==
+ TDI_CONNECTION_CONTEXT_LENGTH))
+ {
+ /* This is a request to open a connection endpoint */
+
+ /* Parameter checks */
+
+ if (EaInfo->EaValueLength < sizeof(PVOID))
+ {
+ TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n"));
+ ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Can only do connection oriented communication using TCP */
+
+ if (DeviceObject != TCPDeviceObject)
+ {
+ TI_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
+ ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ ClientContext = *((PVOID*)(EaInfo->EaName + EaInfo->EaNameLength));
+
+ /* Open connection endpoint file object */
+
+ Status = FileOpenConnection(&Request, ClientContext);
+ if (NT_SUCCESS(Status))
+ {
+ IrpSp->FileObject->FsContext2 = (PVOID)TDI_CONNECTION_FILE;
+ Context->Handle.ConnectionContext = Request.Handle.ConnectionContext;
+ }
}
- } else {
- /* This is a request to open a control connection */
- Status = FileOpenControlChannel(&Request);
- if (NT_SUCCESS(Status)) {
- IrpSp->FileObject->FsContext2 = (PVOID)TDI_CONTROL_CHANNEL_FILE;
- Context->Handle.ControlChannel = Request.Handle.ControlChannel;
+ else
+ {
+ /* This is a request to open a control connection */
+ Status = FileOpenControlChannel(&Request);
+ if (NT_SUCCESS(Status))
+ {
+ IrpSp->FileObject->FsContext2 = (PVOID)TDI_CONTROL_CHANNEL_FILE;
+ Context->Handle.ControlChannel = Request.Handle.ControlChannel;
+ }
}
- }
- if (!NT_SUCCESS(Status))
- ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
+ if (!NT_SUCCESS(Status))
+ ExFreePoolWithTag(Context, TRANS_CONTEXT_TAG);
- TI_DbgPrint(DEBUG_IRP, ("Leaving. Status = (0x%X).\n", Status));
+ TI_DbgPrint(DEBUG_IRP, ("Leaving. Status = (0x%X).\n", Status));
- Irp->IoStatus.Status = Status;
- return Status;
+ Irp->IoStatus.Status = Status;
+ return Status;
}
PDEVICE_OBJECT DeviceObject,
PIRP Irp)
{
- PIO_STACK_LOCATION IrpSp;
- PTRANSPORT_CONTEXT Context;
- TDI_REQUEST Request;
- NTSTATUS Status;
-
- IrpSp = IoGetCurrentIrpStackLocation(Irp);
- Context = IrpSp->FileObject->FsContext;
- if (!Context) {
- TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n"));
- return STATUS_INVALID_PARAMETER;
- }
-
- switch ((ULONG_PTR)IrpSp->FileObject->FsContext2) {
- case TDI_TRANSPORT_ADDRESS_FILE:
- Request.Handle.AddressHandle = Context->Handle.AddressHandle;
- Status = FileCloseAddress(&Request);
- break;
-
- case TDI_CONNECTION_FILE:
- Request.Handle.ConnectionContext = Context->Handle.ConnectionContext;
- Status = FileCloseConnection(&Request);
- break;
-
- case TDI_CONTROL_CHANNEL_FILE:
- Request.Handle.ControlChannel = Context->Handle.ControlChannel;
- Status = FileCloseControlChannel(&Request);
- break;
+ PIO_STACK_LOCATION IrpSp;
+ PTRANSPORT_CONTEXT Context;
+ TDI_REQUEST Request;
+ NTSTATUS Status;
+
+ IrpSp = IoGetCurrentIrpStackLocation(Irp);
+ Context = IrpSp->FileObject->FsContext;
+ if (!Context)
+ {
+ TI_DbgPrint(MIN_TRACE, ("Parameters are invalid.\n"));
+ return STATUS_INVALID_PARAMETER;
+ }
- default:
- DbgPrint("Unknown type %d\n", (ULONG_PTR)IrpSp->FileObject->FsContext2);
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
+ switch ((ULONG_PTR)IrpSp->FileObject->FsContext2)
+ {
+ case TDI_TRANSPORT_ADDRESS_FILE:
+ Request.Handle.AddressHandle = Context->Handle.AddressHandle;
+ Status = FileCloseAddress(&Request);
+ break;
+
+ case TDI_CONNECTION_FILE:
+ Request.Handle.ConnectionContext = Context->Handle.ConnectionContext;
+ Status = FileCloseConnection(&Request);
+ break;
+
+ case TDI_CONTROL_CHANNEL_FILE:
+ Request.Handle.ControlChannel = Context->Handle.ControlChannel;
+ Status = FileCloseControlChannel(&Request);
+ break;
+
+ default:
+ Status = STATUS_INVALID_PARAMETER;
+ break;
+ }
- Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Status = Status;
- return Irp->IoStatus.Status;
+ return Irp->IoStatus.Status;
}
IrpSp = IoGetCurrentIrpStackLocation(Irp);
- TI_DbgPrint(DEBUG_IRP, ("Called. DeviceObject is at (0x%X), IRP is at (0x%X) MN (%d).\n",
+ TI_DbgPrint(DEBUG_IRP, ("[TCPIP, TiDispatchInternal] Called. DeviceObject is at (0x%X), IRP is at (0x%X) MN (%d).\n",
DeviceObject, Irp, IrpSp->MinorFunction));
Irp->IoStatus.Status = STATUS_SUCCESS;
Status = STATUS_INVALID_DEVICE_REQUEST;
}
- TI_DbgPrint(DEBUG_IRP, ("Leaving. Status = (0x%X).\n", Status));
+ TI_DbgPrint(DEBUG_IRP, ("[TCPIP, TiDispatchInternal] Leaving. Status = (0x%X).\n", Status));
if( Complete )
IRPFinish( Irp, Status );
IrpSp = IoGetCurrentIrpStackLocation(Irp);
- TI_DbgPrint(DEBUG_IRP, ("Called. IRP is at (0x%X).\n", Irp));
+ TI_DbgPrint(DEBUG_IRP, ("[TCPIP, TiDispatch] Called. IRP is at (0x%X).\n", Irp));
Irp->IoStatus.Information = 0;
}
}
- TI_DbgPrint(DEBUG_IRP, ("Leaving. Status = (0x%X).\n", Status));
+ TI_DbgPrint(DEBUG_IRP, ("[TCPIP, TiDispatch] Leaving. Status = (0x%X).\n", Status));
return IRPFinish( Irp, Status );
}
TcpipAcquireSpinLock(&AddressFileListLock, &OldIrql);
if (!IsListEmpty(&AddressFileListHead)) {
- TI_DbgPrint(MIN_TRACE, ("Open address file objects exists.\n"));
+ TI_DbgPrint(MIN_TRACE, ("[TCPIP, TiUnload] Called. Open address file objects exists.\n"));
}
TcpipReleaseSpinLock(&AddressFileListLock, OldIrql);
#endif
if (EntityList)
ExFreePoolWithTag(EntityList, TDI_ENTITY_TAG);
- TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
-}
-
-VOID NTAPI IPTimeoutDpcFn(
- PKDPC Dpc,
- PVOID DeferredContext,
- PVOID SystemArgument1,
- PVOID SystemArgument2)
-/*
- * FUNCTION: Timeout DPC
- * ARGUMENTS:
- * Dpc = Pointer to our DPC object
- * DeferredContext = Pointer to context information (unused)
- * SystemArgument1 = Unused
- * SystemArgument2 = Unused
- * NOTES:
- * This routine is dispatched once in a while to do maintainance jobs
- */
-{
- if( !IpWorkItemQueued ) {
- ExQueueWorkItem( &IpWorkItem, DelayedWorkQueue );
- IpWorkItemQueued = TRUE;
- }
+ TI_DbgPrint(MAX_TRACE, ("[TCPIP, TiUnload] Leaving.\n"));
}
NTSTATUS NTAPI
NDIS_STATUS NdisStatus;
LARGE_INTEGER DueTime;
- TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+ TI_DbgPrint(MAX_TRACE, ("[TCPIP, DriverEntry] Called\n"));
/* TdiInitialize() ? */
/* Initialize our periodic timer and its associated DPC object. When the
timer expires, the IPTimeout deferred procedure call (DPC) is queued */
- ExInitializeWorkItem( &IpWorkItem, IPTimeout, NULL );
KeInitializeDpc(&IPTimeoutDpc, IPTimeoutDpcFn, NULL);
KeInitializeTimer(&IPTimer);
EntityMax = MAX_TDI_ENTITIES;
/* Allocate NDIS packet descriptors */
- NdisAllocatePacketPool(&NdisStatus, &GlobalPacketPool, 100, sizeof(PACKET_CONTEXT));
+ NdisAllocatePacketPoolEx(&NdisStatus, &GlobalPacketPool, 500, 1500, sizeof(PACKET_CONTEXT));
if (NdisStatus != NDIS_STATUS_SUCCESS) {
TiUnload(DriverObject);
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Allocate NDIS buffer descriptors */
- NdisAllocateBufferPool(&NdisStatus, &GlobalBufferPool, 100);
+ NdisAllocateBufferPool(&NdisStatus, &GlobalBufferPool, 2000);
if (NdisStatus != NDIS_STATUS_SUCCESS) {
TiUnload(DriverObject);
return STATUS_INSUFFICIENT_RESOURCES;
DueTime.QuadPart = -(LONGLONG)IP_TIMEOUT * 10000;
KeSetTimerEx(&IPTimer, DueTime, IP_TIMEOUT, &IPTimeoutDpc);
+ TI_DbgPrint(MAX_TRACE, ("[TCPIP, DriverEntry] Finished\n"));
+
+
return STATUS_SUCCESS;
}