From 669a79e12b9975ca84dcbf31cb7cc528e3624bfa Mon Sep 17 00:00:00 2001 From: Vizzini Date: Thu, 20 Nov 2003 06:31:51 +0000 Subject: [PATCH] began refreshing tditest a bit svn path=/trunk/; revision=6724 --- reactos/drivers/net/tditest/include/tditest.h | 8 +- reactos/drivers/net/tditest/makefile | 4 +- reactos/drivers/net/tditest/tditest/SOURCES | 2 +- reactos/drivers/net/tditest/tditest/tditest.c | 1155 +++++++++-------- 4 files changed, 588 insertions(+), 581 deletions(-) diff --git a/reactos/drivers/net/tditest/include/tditest.h b/reactos/drivers/net/tditest/include/tditest.h index 95a22080ab2..f0d99edf8a2 100644 --- a/reactos/drivers/net/tditest/include/tditest.h +++ b/reactos/drivers/net/tditest/include/tditest.h @@ -8,9 +8,7 @@ #define __TDITEST_H #ifdef _MSC_VER -#include #include -#include #include #include #else @@ -18,14 +16,11 @@ #include #include #endif - -#include +#include "debug.h" /* Name of UDP device */ #define UDP_DEVICE_NAME L"\\Device\\Udp" -//#define UDP_DEVICE_NAME L"\\Device\\NTUdp" - #ifdef i386 @@ -129,3 +124,4 @@ typedef struct IPADDR_ENTRY { #endif /*__TDITEST_H */ /* EOF */ + diff --git a/reactos/drivers/net/tditest/makefile b/reactos/drivers/net/tditest/makefile index 6582e691aec..46467253eab 100644 --- a/reactos/drivers/net/tditest/makefile +++ b/reactos/drivers/net/tditest/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.8 2001/08/21 20:13:16 chorns Exp $ +# $Id: makefile,v 1.9 2003/11/20 06:31:51 vizzini Exp $ PATH_TO_TOP = ../../.. @@ -6,7 +6,7 @@ TARGET_TYPE = driver TARGET_NAME = tditest -TARGET_CFLAGS = -I./include +TARGET_CFLAGS = -I./include -Wall -Werror TARGET_OBJECTS = \ tditest/tditest.o diff --git a/reactos/drivers/net/tditest/tditest/SOURCES b/reactos/drivers/net/tditest/tditest/SOURCES index c2c4df075ec..91ac6a13484 100644 --- a/reactos/drivers/net/tditest/tditest/SOURCES +++ b/reactos/drivers/net/tditest/tditest/SOURCES @@ -1,5 +1,5 @@ TARGETNAME=tditest -TARGETPATH=..\objects +TARGETPATH=obj TARGETTYPE=DRIVER TARGETLIBS=$(DDK_LIB_PATH)\tdi.lib \ diff --git a/reactos/drivers/net/tditest/tditest/tditest.c b/reactos/drivers/net/tditest/tditest/tditest.c index eb60caac19e..7613bbcf567 100644 --- a/reactos/drivers/net/tditest/tditest/tditest.c +++ b/reactos/drivers/net/tditest/tditest/tditest.c @@ -13,7 +13,7 @@ #ifdef DBG /* See debug.h for debug/trace constants */ -DWORD DebugTraceLevel = MIN_TRACE; +ULONG DebugTraceLevel = -1; #endif /* DBG */ @@ -49,44 +49,42 @@ NTSTATUS TdiCall( * All requests are completed synchronously. A request may be cancelled */ { - KEVENT Event; - PKEVENT Events[2]; - NTSTATUS Status; - Events[0] = &StopEvent; - Events[1] = &Event; - - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Irp->UserEvent = &Event; - Irp->UserIosb = IoStatusBlock; - Status = IoCallDriver(DeviceObject, Irp); - if (Status == STATUS_PENDING) { - if (CanCancel) { - Status = KeWaitForMultipleObjects(2, - (PVOID)&Events, - WaitAny, - Executive, - KernelMode, - FALSE, - NULL, - NULL); + KEVENT Event; + PKEVENT Events[2]; + NTSTATUS Status; + Events[0] = &StopEvent; + Events[1] = &Event; - if (KeReadStateEvent(&StopEvent) != 0) { - if (IoCancelIrp(Irp)) { - TDI_DbgPrint(MAX_TRACE, ("Cancelled IRP.\n")); - } else { - TDI_DbgPrint(MIN_TRACE, ("Could not cancel IRP.\n")); - } - return STATUS_CANCELLED; - } - } else - Status = KeWaitForSingleObject(&Event, - Executive, - KernelMode, - FALSE, - NULL); - } + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Irp->UserEvent = &Event; + Irp->UserIosb = IoStatusBlock; - return (Status == STATUS_SUCCESS)? IoStatusBlock->Status : STATUS_SUCCESS; + Status = IoCallDriver(DeviceObject, Irp); + + if (Status == STATUS_PENDING) + { + if (CanCancel) + { + Status = KeWaitForMultipleObjects(2, (PVOID)&Events, WaitAny, Executive, KernelMode, FALSE, NULL, NULL); + + if (KeReadStateEvent(&StopEvent) != 0) + { + if (IoCancelIrp(Irp)) + { + TDI_DbgPrint(MAX_TRACE, ("Cancelled IRP.\n")); + } + else + { + TDI_DbgPrint(MIN_TRACE, ("Could not cancel IRP.\n")); + } + return STATUS_CANCELLED; + } + } + else + Status = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + } + + return (Status == STATUS_SUCCESS)? IoStatusBlock->Status : STATUS_SUCCESS; } @@ -108,43 +106,49 @@ NTSTATUS TdiOpenDevice( * Status of operation */ { - OBJECT_ATTRIBUTES Attr; - IO_STATUS_BLOCK Iosb; - UNICODE_STRING Name; - NTSTATUS Status; + OBJECT_ATTRIBUTES Attr; + IO_STATUS_BLOCK Iosb; + UNICODE_STRING Name; + NTSTATUS Status; - RtlInitUnicodeString(&Name, Protocol); - InitializeObjectAttributes(&Attr, /* Attribute buffer */ - &Name, /* Device name */ - OBJ_CASE_INSENSITIVE, /* Attributes */ - NULL, /* Root directory */ - NULL); /* Security descriptor */ + RtlInitUnicodeString(&Name, Protocol); + InitializeObjectAttributes(&Attr, /* Attribute buffer */ + &Name, /* Device name */ + OBJ_CASE_INSENSITIVE, /* Attributes */ + NULL, /* Root directory */ + NULL); /* Security descriptor */ - Status = ZwCreateFile(Handle, /* Return file handle */ - GENERIC_READ | GENERIC_WRITE, /* Desired access */ - &Attr, /* Object attributes */ - &Iosb, /* IO status */ - 0, /* Initial allocation size */ - FILE_ATTRIBUTE_NORMAL, /* File attributes */ - FILE_SHARE_READ | FILE_SHARE_WRITE, /* Share access */ - FILE_OPEN_IF, /* Create disposition */ - 0, /* Create options */ - EaInfo, /* EA buffer */ - EaLength); /* EA length */ - if (NT_SUCCESS(Status)) { - Status = ObReferenceObjectByHandle(*Handle, /* Handle to open file */ - GENERIC_READ | GENERIC_WRITE, /* Access mode */ - NULL, /* Object type */ - KernelMode, /* Access mode */ - (PVOID*)Object, /* Pointer to object */ - NULL); /* Handle information */ - if (!NT_SUCCESS(Status)) { - TDI_DbgPrint(MIN_TRACE, ("ObReferenceObjectByHandle() failed with status (0x%X).\n", Status)); - ZwClose(*Handle); - } - } else { - TDI_DbgPrint(MIN_TRACE, ("ZwCreateFile() failed with status (0x%X)\n", Status)); - } + Status = ZwCreateFile(Handle, /* Return file handle */ + GENERIC_READ | GENERIC_WRITE, /* Desired access */ + &Attr, /* Object attributes */ + &Iosb, /* IO status */ + 0, /* Initial allocation size */ + FILE_ATTRIBUTE_NORMAL, /* File attributes */ + FILE_SHARE_READ | FILE_SHARE_WRITE, /* Share access */ + FILE_OPEN_IF, /* Create disposition */ + 0, /* Create options */ + EaInfo, /* EA buffer */ + EaLength); /* EA length */ + + if (NT_SUCCESS(Status)) + { + Status = ObReferenceObjectByHandle(*Handle, /* Handle to open file */ + GENERIC_READ | GENERIC_WRITE, /* Access mode */ + NULL, /* Object type */ + KernelMode, /* Access mode */ + (PVOID*)Object, /* Pointer to object */ + NULL); /* Handle information */ + + if (!NT_SUCCESS(Status)) + { + TDI_DbgPrint(MIN_TRACE, ("ObReferenceObjectByHandle() failed with status (0x%X).\n", Status)); + ZwClose(*Handle); + } + } + else + { + TDI_DbgPrint(MIN_TRACE, ("ZwCreateFile() failed with status (0x%X)\n", Status)); + } return Status; } @@ -154,13 +158,13 @@ NTSTATUS TdiCloseDevice( HANDLE Handle, PFILE_OBJECT FileObject) { - if (FileObject) - ObDereferenceObject(FileObject); + if (FileObject) + ObDereferenceObject(FileObject); - if (Handle) - ZwClose(Handle); + if (Handle) + ZwClose(Handle); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } @@ -180,40 +184,36 @@ NTSTATUS TdiOpenTransport( * Status of operation */ { - PFILE_FULL_EA_INFORMATION EaInfo; - PTA_ADDRESS_IP Address; - NTSTATUS Status; - ULONG EaLength; + PFILE_FULL_EA_INFORMATION EaInfo; + PTA_IP_ADDRESS Address; + NTSTATUS Status; + ULONG EaLength; - EaLength = sizeof(FILE_FULL_EA_INFORMATION) + - TDI_TRANSPORT_ADDRESS_LENGTH + - sizeof(TA_ADDRESS_IP); - EaInfo = (PFILE_FULL_EA_INFORMATION)ExAllocatePool(NonPagedPool, EaLength); - if (!EaInfo) { - TDI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - return STATUS_INSUFFICIENT_RESOURCES; - } + EaLength = sizeof(FILE_FULL_EA_INFORMATION) + TDI_TRANSPORT_ADDRESS_LENGTH + sizeof(TA_IP_ADDRESS); + EaInfo = (PFILE_FULL_EA_INFORMATION)ExAllocatePool(NonPagedPool, EaLength); - RtlZeroMemory(EaInfo, EaLength); - EaInfo->EaNameLength = TDI_TRANSPORT_ADDRESS_LENGTH; - RtlCopyMemory(EaInfo->EaName, - TdiTransportAddress, - TDI_TRANSPORT_ADDRESS_LENGTH); - EaInfo->EaValueLength = sizeof(TA_ADDRESS_IP); - Address = (PTA_ADDRESS_IP)(EaInfo->EaName + TDI_TRANSPORT_ADDRESS_LENGTH); - Address->TAAddressCount = 1; - Address->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP; - Address->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; - Address->Address[0].Address[0].sin_port = WH2N(Port); - Address->Address[0].Address[0].in_addr = 0; - Status = TdiOpenDevice(Protocol, - EaLength, - EaInfo, - Transport, - TransportObject); - ExFreePool(EaInfo); + if (!EaInfo) + { + TDI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } - return Status; + RtlZeroMemory(EaInfo, EaLength); + EaInfo->EaNameLength = TDI_TRANSPORT_ADDRESS_LENGTH; + RtlCopyMemory(EaInfo->EaName, TdiTransportAddress, TDI_TRANSPORT_ADDRESS_LENGTH); + EaInfo->EaValueLength = sizeof(TA_IP_ADDRESS); + Address = (PTA_IP_ADDRESS)(EaInfo->EaName + TDI_TRANSPORT_ADDRESS_LENGTH); + Address->TAAddressCount = 1; + Address->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP; + Address->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; + Address->Address[0].Address[0].sin_port = WH2N(Port); + Address->Address[0].Address[0].in_addr = 0; + + Status = TdiOpenDevice(Protocol, EaLength, EaInfo, Transport, TransportObject); + + ExFreePool(EaInfo); + + return Status; } @@ -238,35 +238,31 @@ NTSTATUS TdiQueryDeviceControl( * Status of operation */ { - PDEVICE_OBJECT DeviceObject; - PIO_STACK_LOCATION IoStack; - IO_STATUS_BLOCK Iosb; - NTSTATUS Status; - PIRP Irp; + PDEVICE_OBJECT DeviceObject; + PIO_STACK_LOCATION IoStack; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; + PIRP Irp; - DeviceObject = IoGetRelatedDeviceObject(FileObject); - Irp = IoBuildDeviceIoControlRequest(IoControlCode, - DeviceObject, - InputBuffer, - InputBufferLength, - OutputBuffer, - OutputBufferLength, - FALSE, - NULL, - NULL); - if (!Irp) { - TDI_DbgPrint(MIN_TRACE, ("IoBuildDeviceIoControlRequest() failed.\n")); - return STATUS_INSUFFICIENT_RESOURCES; - } + DeviceObject = IoGetRelatedDeviceObject(FileObject); + Irp = IoBuildDeviceIoControlRequest(IoControlCode, DeviceObject, InputBuffer, InputBufferLength, OutputBuffer, + OutputBufferLength, FALSE, NULL, NULL); - IoStack = IoGetNextIrpStackLocation(Irp); - IoStack->DeviceObject = DeviceObject; - IoStack->FileObject = FileObject; - Status = TdiCall(Irp, DeviceObject, &Iosb, FALSE); - if (Return) - *Return = Iosb.Information; + if (!Irp) + { + TDI_DbgPrint(MIN_TRACE, ("IoBuildDeviceIoControlRequest() failed.\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } - return Status; + IoStack = IoGetNextIrpStackLocation(Irp); + IoStack->DeviceObject = DeviceObject; + IoStack->FileObject = FileObject; + Status = TdiCall(Irp, DeviceObject, &Iosb, FALSE); + + if (Return) + *Return = Iosb.Information; + + return Status; } @@ -294,22 +290,22 @@ NTSTATUS TdiQueryInformationEx( * Status of operation */ { - TCP_REQUEST_QUERY_INFORMATION_EX QueryInfo; + TCP_REQUEST_QUERY_INFORMATION_EX QueryInfo; - RtlZeroMemory(&QueryInfo, sizeof(TCP_REQUEST_QUERY_INFORMATION_EX)); - QueryInfo.ID.toi_entity.tei_entity = Entity; - QueryInfo.ID.toi_entity.tei_instance = Instance; - QueryInfo.ID.toi_class = Class; - QueryInfo.ID.toi_type = Type; - QueryInfo.ID.toi_id = Id; + RtlZeroMemory(&QueryInfo, sizeof(TCP_REQUEST_QUERY_INFORMATION_EX)); + QueryInfo.ID.toi_entity.tei_entity = Entity; + QueryInfo.ID.toi_entity.tei_instance = Instance; + QueryInfo.ID.toi_class = Class; + QueryInfo.ID.toi_type = Type; + QueryInfo.ID.toi_id = Id; - return TdiQueryDeviceControl(FileObject, /* Transport/connection object */ - IOCTL_TCP_QUERY_INFORMATION_EX, /* Control code */ - &QueryInfo, /* Input buffer */ - sizeof(TCP_REQUEST_QUERY_INFORMATION_EX), /* Input buffer length */ - OutputBuffer, /* Output buffer */ - *OutputLength, /* Output buffer length */ - OutputLength); /* Return information */ + return TdiQueryDeviceControl(FileObject, /* Transport/connection object */ + IOCTL_TCP_QUERY_INFORMATION_EX, /* Control code */ + &QueryInfo, /* Input buffer */ + sizeof(TCP_REQUEST_QUERY_INFORMATION_EX), /* Input buffer length */ + OutputBuffer, /* Output buffer */ + *OutputLength, /* Output buffer length */ + OutputLength); /* Return information */ } @@ -325,124 +321,139 @@ NTSTATUS TdiQueryAddress( * Status of operation */ { - UINT i; - TDIEntityID *Entities; - ULONG EntityCount; - ULONG EntityType; - IPSNMP_INFO SnmpInfo; - PIPADDR_ENTRY IpAddress; - ULONG BufferSize; - NTSTATUS Status = STATUS_SUCCESS; + ULONG i; + TDIEntityID *Entities; + ULONG EntityCount; + ULONG EntityType; + IPSNMP_INFO SnmpInfo; + PIPADDR_ENTRY IpAddress; + ULONG BufferSize; + NTSTATUS Status = STATUS_SUCCESS; - TDI_DbgPrint(MAX_TRACE, ("Called\n")); + TDI_DbgPrint(MAX_TRACE, ("Called\n")); - BufferSize = sizeof(TDIEntityID) * 20; - Entities = (TDIEntityID*)ExAllocatePool(NonPagedPool, BufferSize); - if (!Entities) { - TDI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - return STATUS_INSUFFICIENT_RESOURCES; - } + BufferSize = sizeof(TDIEntityID) * 20; + Entities = (TDIEntityID*)ExAllocatePool(NonPagedPool, BufferSize); - /* Query device for supported entities */ + if (!Entities) + { + TDI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + return STATUS_INSUFFICIENT_RESOURCES; + } - Status = TdiQueryInformationEx(FileObject, /* File object */ - GENERIC_ENTITY, /* Entity */ - TL_INSTANCE, /* Instance */ - INFO_CLASS_GENERIC, /* Entity class */ - INFO_TYPE_PROVIDER, /* Entity type */ - ENTITY_LIST_ID, /* Entity id */ - Entities, /* Output buffer */ - &BufferSize); /* Output buffer size */ - if (!NT_SUCCESS(Status)) { - TDI_DbgPrint(MIN_TRACE, ("Unable to get list of supported entities (Status = 0x%X).\n", Status)); - ExFreePool(Entities); - return Status; - } + /* Query device for supported entities */ + Status = TdiQueryInformationEx(FileObject, /* File object */ + GENERIC_ENTITY, /* Entity */ + TL_INSTANCE, /* Instance */ + INFO_CLASS_GENERIC, /* Entity class */ + INFO_TYPE_PROVIDER, /* Entity type */ + ENTITY_LIST_ID, /* Entity id */ + Entities, /* Output buffer */ + &BufferSize); /* Output buffer size */ - /* Locate an IP entity */ - EntityCount = BufferSize / sizeof(TDIEntityID); + if (!NT_SUCCESS(Status)) + { + TDI_DbgPrint(MIN_TRACE, ("Unable to get list of supported entities (Status = 0x%X).\n", Status)); + ExFreePool(Entities); + return Status; + } - TDI_DbgPrint(MAX_TRACE, ("EntityCount = %d\n", EntityCount)); + /* Locate an IP entity */ + EntityCount = BufferSize / sizeof(TDIEntityID); - for (i = 0; i < EntityCount; i++) { - if (Entities[i].tei_entity == CL_NL_ENTITY) { - /* Query device for entity type */ + TDI_DbgPrint(MAX_TRACE, ("EntityCount = %d\n", EntityCount)); - BufferSize = sizeof(EntityType); - Status = TdiQueryInformationEx(FileObject, /* File object */ - CL_NL_ENTITY, /* Entity */ - Entities[i].tei_instance, /* Instance */ - INFO_CLASS_GENERIC, /* Entity class */ - INFO_TYPE_PROVIDER, /* Entity type */ - ENTITY_TYPE_ID, /* Entity id */ - &EntityType, /* Output buffer */ - &BufferSize); /* Output buffer size */ - if (!NT_SUCCESS(Status) || (EntityType != CL_NL_IP)) { - TDI_DbgPrint(MIN_TRACE, ("Unable to get entity of type IP (Status = 0x%X).\n", Status)); - break; - } + for (i = 0; i < EntityCount; i++) + { + if (Entities[i].tei_entity == CL_NL_ENTITY) + { + /* Query device for entity type */ + BufferSize = sizeof(EntityType); + Status = TdiQueryInformationEx(FileObject, /* File object */ + CL_NL_ENTITY, /* Entity */ + Entities[i].tei_instance, /* Instance */ + INFO_CLASS_GENERIC, /* Entity class */ + INFO_TYPE_PROVIDER, /* Entity type */ + ENTITY_TYPE_ID, /* Entity id */ + &EntityType, /* Output buffer */ + &BufferSize); /* Output buffer size */ - /* Query device for SNMP information */ + if (!NT_SUCCESS(Status) || (EntityType != CL_NL_IP)) + { + TDI_DbgPrint(MIN_TRACE, ("Unable to get entity of type IP (Status = 0x%X).\n", Status)); + break; + } - BufferSize = sizeof(SnmpInfo); - Status = TdiQueryInformationEx(FileObject, /* File object */ - CL_NL_ENTITY, /* Entity */ - Entities[i].tei_instance, /* Instance */ - INFO_CLASS_PROTOCOL, /* Entity class */ - INFO_TYPE_PROVIDER, /* Entity type */ - IP_MIB_STATS_ID, /* Entity id */ - &SnmpInfo, /* Output buffer */ - &BufferSize); /* Output buffer size */ - if (!NT_SUCCESS(Status) || (SnmpInfo.NumAddr == 0)) { - TDI_DbgPrint(MIN_TRACE, ("Unable to get SNMP information or no IP addresses available (Status = 0x%X).\n", Status)); - break; - } + /* Query device for SNMP information */ + BufferSize = sizeof(SnmpInfo); + Status = TdiQueryInformationEx(FileObject, /* File object */ + CL_NL_ENTITY, /* Entity */ + Entities[i].tei_instance, /* Instance */ + INFO_CLASS_PROTOCOL, /* Entity class */ + INFO_TYPE_PROVIDER, /* Entity type */ + IP_MIB_STATS_ID, /* Entity id */ + &SnmpInfo, /* Output buffer */ + &BufferSize); /* Output buffer size */ - /* Query device for all IP addresses */ + if (!NT_SUCCESS(Status) || (SnmpInfo.NumAddr == 0)) + { + TDI_DbgPrint(MIN_TRACE, ("Unable to get SNMP information or no IP addresses available (Status = 0x%X).\n", Status)); + break; + } - if (SnmpInfo.NumAddr != 0) { - BufferSize = SnmpInfo.NumAddr * sizeof(IPADDR_ENTRY); - IpAddress = (PIPADDR_ENTRY)ExAllocatePool(NonPagedPool, BufferSize); - if (!IpAddress) { - TDI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); - break; - } + /* Query device for all IP addresses */ + if (SnmpInfo.NumAddr != 0) + { + BufferSize = SnmpInfo.NumAddr * sizeof(IPADDR_ENTRY); + IpAddress = (PIPADDR_ENTRY)ExAllocatePool(NonPagedPool, BufferSize); + if (!IpAddress) + { + TDI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); + break; + } - Status = TdiQueryInformationEx(FileObject, /* File object */ - CL_NL_ENTITY, /* Entity */ - Entities[i].tei_instance, /* Instance */ - INFO_CLASS_PROTOCOL, /* Entity class */ - INFO_TYPE_PROVIDER, /* Entity type */ - IP_MIB_ADDRTABLE_ENTRY_ID, /* Entity id */ - IpAddress, /* Output buffer */ - &BufferSize); /* Output buffer size */ - if (!NT_SUCCESS(Status)) { - TDI_DbgPrint(MIN_TRACE, ("Unable to get IP address (Status = 0x%X).\n", Status)); - ExFreePool(IpAddress); - break; - } + Status = TdiQueryInformationEx(FileObject, /* File object */ + CL_NL_ENTITY, /* Entity */ + Entities[i].tei_instance, /* Instance */ + INFO_CLASS_PROTOCOL, /* Entity class */ + INFO_TYPE_PROVIDER, /* Entity type */ + IP_MIB_ADDRTABLE_ENTRY_ID, /* Entity id */ + IpAddress, /* Output buffer */ + &BufferSize); /* Output buffer size */ - if (SnmpInfo.NumAddr != 1) { - /* Skip loopback address */ - *Address = DN2H(((PIPADDR_ENTRY)((ULONG)IpAddress + sizeof(IPADDR_ENTRY)))->Addr); - } else { - /* Select the first address returned */ - *Address = DN2H(IpAddress->Addr); - } + if (!NT_SUCCESS(Status)) + { + TDI_DbgPrint(MIN_TRACE, ("Unable to get IP address (Status = 0x%X).\n", Status)); + ExFreePool(IpAddress); + break; + } - ExFreePool(IpAddress); - } else { - Status = STATUS_UNSUCCESSFUL; - break; - } - } - } + if (SnmpInfo.NumAddr != 1) + { + /* Skip loopback address */ + *Address = DN2H(((PIPADDR_ENTRY)((ULONG)IpAddress + sizeof(IPADDR_ENTRY)))->Addr); + } + else + { + /* Select the first address returned */ + *Address = DN2H(IpAddress->Addr); + } + ExFreePool(IpAddress); - ExFreePool(Entities); + } + else + { + Status = STATUS_UNSUCCESSFUL; + break; + } + } + } - TDI_DbgPrint(MAX_TRACE, ("Leaving\n")); + ExFreePool(Entities); - return Status; + TDI_DbgPrint(MAX_TRACE, ("Leaving\n")); + + return Status; } @@ -464,90 +475,97 @@ NTSTATUS TdiSendDatagram( * Status of operation */ { - PIRP Irp; - PMDL Mdl; - PDEVICE_OBJECT DeviceObject; - PTDI_CONNECTION_INFORMATION ConnectInfo; - PTA_ADDRESS_IP TA; - PTDI_ADDRESS_IP IpAddress; - IO_STATUS_BLOCK Iosb; - NTSTATUS Status; + PIRP Irp; + PMDL Mdl; + PDEVICE_OBJECT DeviceObject; + PTDI_CONNECTION_INFORMATION ConnectInfo; + PTA_IP_ADDRESS TA; + PTDI_ADDRESS_IP IpAddress; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; - DeviceObject = IoGetRelatedDeviceObject(TransportObject); - ConnectInfo = (PTDI_CONNECTION_INFORMATION) - ExAllocatePool(NonPagedPool, - sizeof(TDI_CONNECTION_INFORMATION) + - sizeof(TA_ADDRESS_IP)); + DeviceObject = IoGetRelatedDeviceObject(TransportObject); + ConnectInfo = (PTDI_CONNECTION_INFORMATION) + ExAllocatePool(NonPagedPool, + sizeof(TDI_CONNECTION_INFORMATION) + + sizeof(TA_IP_ADDRESS)); - if (!ConnectInfo) - return STATUS_INSUFFICIENT_RESOURCES; + if (!ConnectInfo) + return STATUS_INSUFFICIENT_RESOURCES; - RtlZeroMemory(ConnectInfo, - sizeof(TDI_CONNECTION_INFORMATION) + - sizeof(TA_ADDRESS_IP)); + RtlZeroMemory(ConnectInfo, sizeof(TDI_CONNECTION_INFORMATION) + sizeof(TA_IP_ADDRESS)); - ConnectInfo->RemoteAddressLength = sizeof(TA_ADDRESS_IP); - ConnectInfo->RemoteAddress = (PUCHAR) - ((ULONG)ConnectInfo + sizeof(TDI_CONNECTION_INFORMATION)); + ConnectInfo->RemoteAddressLength = sizeof(TA_IP_ADDRESS); + ConnectInfo->RemoteAddress = (PUCHAR) ((ULONG)ConnectInfo + sizeof(TDI_CONNECTION_INFORMATION)); - TA = (PTA_ADDRESS_IP)(ConnectInfo->RemoteAddress); - TA->TAAddressCount = 1; - TA->Address[0].AddressLength = sizeof(TDI_ADDRESS_IP); - TA->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; - IpAddress = (PTDI_ADDRESS_IP)(TA->Address[0].Address); - IpAddress->sin_port = WH2N(Port); - IpAddress->in_addr = DH2N(Address); - Irp = TdiBuildInternalDeviceControlIrp(TDI_SEND_DATAGRAM, /* Sub function */ - DeviceObject, /* Device object */ - TransportObject, /* File object */ - NULL, /* Event */ - NULL); /* Return buffer */ - if (!Irp) { - TDI_DbgPrint(MIN_TRACE, ("TdiBuildInternalDeviceControlIrp() failed.\n")); - ExFreePool(ConnectInfo); - return STATUS_INSUFFICIENT_RESOURCES; - } + TA = (PTA_IP_ADDRESS)(ConnectInfo->RemoteAddress); + TA->TAAddressCount = 1; + TA->Address[0].AddressLength = sizeof(TDI_ADDRESS_IP); + TA->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; + IpAddress = (PTDI_ADDRESS_IP)(TA->Address[0].Address); + IpAddress->sin_port = WH2N(Port); + IpAddress->in_addr = DH2N(Address); + Irp = TdiBuildInternalDeviceControlIrp( + TDI_SEND_DATAGRAM, /* Sub function */ + DeviceObject, /* Device object */ + TransportObject, /* File object */ + NULL, /* Event */ + NULL); /* Return buffer */ - Mdl = IoAllocateMdl(Buffer, /* Virtual address of buffer */ - BufferSize, /* Length of buffer */ - FALSE, /* Not secondary */ - FALSE, /* Don't charge quota */ - NULL); /* Don't use IRP */ - if (!Mdl) { - TDI_DbgPrint(MIN_TRACE, ("IoAllocateMdl() failed.\n")); - IoFreeIrp(Irp); - ExFreePool(ConnectInfo); - return STATUS_INSUFFICIENT_RESOURCES; - } + if (!Irp) + { + TDI_DbgPrint(MIN_TRACE, ("TdiBuildInternalDeviceControlIrp() failed.\n")); + ExFreePool(ConnectInfo); + return STATUS_INSUFFICIENT_RESOURCES; + } + + Mdl = IoAllocateMdl( + Buffer, /* Virtual address of buffer */ + BufferSize, /* Length of buffer */ + FALSE, /* Not secondary */ + FALSE, /* Don't charge quota */ + NULL); /* Don't use IRP */ + + if (!Mdl) + { + TDI_DbgPrint(MIN_TRACE, ("IoAllocateMdl() failed.\n")); + IoFreeIrp(Irp); + ExFreePool(ConnectInfo); + return STATUS_INSUFFICIENT_RESOURCES; + } #ifdef _MSC_VER - try { + try + { #endif - MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); + MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); #ifdef _MSC_VER - } except(EXCEPTION_EXECUTE_HANDLER) { - TDI_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); - IoFreeMdl(Mdl); - IoFreeIrp(Irp); - ExFreePool(ConnectInfo); - return STATUS_UNSUCCESSFUL; - } + } + except(EXCEPTION_EXECUTE_HANDLER) + { + TDI_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); + IoFreeMdl(Mdl); + IoFreeIrp(Irp); + ExFreePool(ConnectInfo); + return STATUS_UNSUCCESSFUL; + } #endif - TdiBuildSendDatagram(Irp, /* I/O Request Packet */ - DeviceObject, /* Device object */ - TransportObject, /* File object */ - NULL, /* Completion routine */ - NULL, /* Completion context */ - Mdl, /* Descriptor for data buffer */ - BufferSize, /* Size of data to send */ - ConnectInfo); /* Connection information */ + TdiBuildSendDatagram( + Irp, /* I/O Request Packet */ + DeviceObject, /* Device object */ + TransportObject, /* File object */ + NULL, /* Completion routine */ + NULL, /* Completion context */ + Mdl, /* Descriptor for data buffer */ + BufferSize, /* Size of data to send */ + ConnectInfo); /* Connection information */ - Status = TdiCall(Irp, DeviceObject, &Iosb, FALSE); + Status = TdiCall(Irp, DeviceObject, &Iosb, FALSE); - ExFreePool(ConnectInfo); + ExFreePool(ConnectInfo); - return Status; + return Status; } @@ -569,119 +587,127 @@ NTSTATUS TdiReceiveDatagram( * Status of operation */ { - PTDI_CONNECTION_INFORMATION ReceiveInfo; - PTDI_CONNECTION_INFORMATION ReturnInfo; - PTA_ADDRESS_IP ReturnAddress; - PDEVICE_OBJECT DeviceObject; - PTDI_ADDRESS_IP IpAddress; - IO_STATUS_BLOCK Iosb; - PVOID MdlBuffer; - NTSTATUS Status; - PIRP Irp; - PMDL Mdl; + PTDI_CONNECTION_INFORMATION ReceiveInfo; + PTDI_CONNECTION_INFORMATION ReturnInfo; + PTA_IP_ADDRESS ReturnAddress; + PDEVICE_OBJECT DeviceObject; + PTDI_ADDRESS_IP IpAddress; + IO_STATUS_BLOCK Iosb; + PVOID MdlBuffer; + NTSTATUS Status; + PIRP Irp; + PMDL Mdl; - DeviceObject = IoGetRelatedDeviceObject(TransportObject); - if (!DeviceObject) - return STATUS_INVALID_PARAMETER; + DeviceObject = IoGetRelatedDeviceObject(TransportObject); + if (!DeviceObject) + return STATUS_INVALID_PARAMETER; - ReceiveInfo = (PTDI_CONNECTION_INFORMATION) - ExAllocatePool(NonPagedPool, - sizeof(TDI_CONNECTION_INFORMATION) + - sizeof(TDI_CONNECTION_INFORMATION) + - sizeof(TA_ADDRESS_IP)); - if (!ReceiveInfo) - return STATUS_INSUFFICIENT_RESOURCES; + ReceiveInfo = (PTDI_CONNECTION_INFORMATION) ExAllocatePool(NonPagedPool, + sizeof(TDI_CONNECTION_INFORMATION) + + sizeof(TDI_CONNECTION_INFORMATION) + + sizeof(TA_IP_ADDRESS)); - MdlBuffer = ExAllocatePool(PagedPool, *BufferSize); - if (!MdlBuffer) - return STATUS_INSUFFICIENT_RESOURCES; + if (!ReceiveInfo) + return STATUS_INSUFFICIENT_RESOURCES; + MdlBuffer = ExAllocatePool(PagedPool, *BufferSize); + if (!MdlBuffer) + return STATUS_INSUFFICIENT_RESOURCES; - RtlZeroMemory(ReceiveInfo, - sizeof(TDI_CONNECTION_INFORMATION) + - sizeof(TDI_CONNECTION_INFORMATION) + - sizeof(TA_ADDRESS_IP)); - RtlCopyMemory(MdlBuffer, Buffer, *BufferSize); + RtlZeroMemory(ReceiveInfo, sizeof(TDI_CONNECTION_INFORMATION) + sizeof(TDI_CONNECTION_INFORMATION) + + sizeof(TA_IP_ADDRESS)); - /* Receive from any address */ - ReceiveInfo->RemoteAddressLength = 0; - ReceiveInfo->RemoteAddress = NULL; + RtlCopyMemory(MdlBuffer, Buffer, *BufferSize); - ReturnInfo = (PTDI_CONNECTION_INFORMATION) - ((ULONG)ReceiveInfo + sizeof(TDI_CONNECTION_INFORMATION)); + /* Receive from any address */ + ReceiveInfo->RemoteAddressLength = 0; + ReceiveInfo->RemoteAddress = NULL; - ReturnInfo->RemoteAddressLength = sizeof(TA_ADDRESS_IP); - ReturnInfo->RemoteAddress = (PUCHAR) - ((ULONG)ReturnInfo + sizeof(TDI_CONNECTION_INFORMATION)); + ReturnInfo = (PTDI_CONNECTION_INFORMATION) ((ULONG)ReceiveInfo + sizeof(TDI_CONNECTION_INFORMATION)); + ReturnInfo->RemoteAddressLength = sizeof(TA_IP_ADDRESS); + ReturnInfo->RemoteAddress = (PUCHAR) ((ULONG)ReturnInfo + sizeof(TDI_CONNECTION_INFORMATION)); - ReturnAddress = (PTA_ADDRESS_IP)(ReturnInfo->RemoteAddress); - ReturnAddress->TAAddressCount = 1; - ReturnAddress->Address[0].AddressLength = sizeof(TDI_ADDRESS_IP); - ReturnAddress->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; + ReturnAddress = (PTA_IP_ADDRESS)(ReturnInfo->RemoteAddress); + ReturnAddress->TAAddressCount = 1; + ReturnAddress->Address[0].AddressLength = sizeof(TDI_ADDRESS_IP); + ReturnAddress->Address[0].AddressType = TDI_ADDRESS_TYPE_IP; - IpAddress = (PTDI_ADDRESS_IP)(ReturnAddress->Address[0].Address); - IpAddress->sin_port = WH2N(Port); - IpAddress->in_addr = DH2N(LocalAddress); + IpAddress = (PTDI_ADDRESS_IP)(ReturnAddress->Address[0].Address); + IpAddress->sin_port = WH2N(Port); + IpAddress->in_addr = DH2N(LocalAddress); - Irp = TdiBuildInternalDeviceControlIrp(TDI_RECEIVE_DATAGRAM, /* Sub function */ - DeviceObject, /* Device object */ - TransportObject, /* File object */ - NULL, /* Event */ - NULL); /* Return buffer */ - if (!Irp) { - ExFreePool(MdlBuffer); - ExFreePool(ReceiveInfo); - return STATUS_INSUFFICIENT_RESOURCES; - } + Irp = TdiBuildInternalDeviceControlIrp( + TDI_RECEIVE_DATAGRAM, /* Sub function */ + DeviceObject, /* Device object */ + TransportObject, /* File object */ + NULL, /* Event */ + NULL); /* Return buffer */ - Mdl = IoAllocateMdl(MdlBuffer, /* Virtual address */ - *BufferSize, /* Length of buffer */ - FALSE, /* Not secondary */ - FALSE, /* Don't charge quota */ - NULL); /* Don't use IRP */ - if (!Mdl) { - IoFreeIrp(Irp); - ExFreePool(MdlBuffer); - ExFreePool(ReceiveInfo); - return STATUS_INSUFFICIENT_RESOURCES; - } + if (!Irp) + { + ExFreePool(MdlBuffer); + ExFreePool(ReceiveInfo); + return STATUS_INSUFFICIENT_RESOURCES; + } + + Mdl = IoAllocateMdl( + MdlBuffer, /* Virtual address */ + *BufferSize, /* Length of buffer */ + FALSE, /* Not secondary */ + FALSE, /* Don't charge quota */ + NULL); /* Don't use IRP */ + + if (!Mdl) + { + IoFreeIrp(Irp); + ExFreePool(MdlBuffer); + ExFreePool(ReceiveInfo); + return STATUS_INSUFFICIENT_RESOURCES; + } #ifdef _MSC_VER - try { + try + { #endif - MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); + MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); #ifdef _MSC_VER - } except (EXCEPTION_EXECUTE_HANDLER) { - TDI_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); - IoFreeMdl(Mdl); - IoFreeIrp(Irp); - ExFreePool(MdlBuffer); - ExFreePool(ReceiveInfo); - return STATUS_INSUFFICIENT_RESOURCES; - } + } + except (EXCEPTION_EXECUTE_HANDLER) + { + TDI_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); + IoFreeMdl(Mdl); + IoFreeIrp(Irp); + ExFreePool(MdlBuffer); + ExFreePool(ReceiveInfo); + return STATUS_INSUFFICIENT_RESOURCES; + } #endif - TdiBuildReceiveDatagram(Irp, /* I/O Request Packet */ - DeviceObject, /* Device object */ - TransportObject, /* File object */ - NULL, /* Completion routine */ - NULL, /* Completion context */ - Mdl, /* Data buffer */ - *BufferSize, /* Size of data buffer */ - ReceiveInfo, /* Connection information */ - ReturnInfo, /* Connection information */ - TDI_RECEIVE_NORMAL); /* Flags */ - Status = TdiCall(Irp, DeviceObject, &Iosb, TRUE); - if (NT_SUCCESS(Status)) { - RtlCopyMemory(Buffer, MdlBuffer, Iosb.Information); - *BufferSize = Iosb.Information; - *Address = DN2H(IpAddress->in_addr); - } + TdiBuildReceiveDatagram( + Irp, /* I/O Request Packet */ + DeviceObject, /* Device object */ + TransportObject, /* File object */ + NULL, /* Completion routine */ + NULL, /* Completion context */ + Mdl, /* Data buffer */ + *BufferSize, /* Size of data buffer */ + ReceiveInfo, /* Connection information */ + ReturnInfo, /* Connection information */ + TDI_RECEIVE_NORMAL); /* Flags */ + + Status = TdiCall(Irp, DeviceObject, &Iosb, TRUE); - ExFreePool(MdlBuffer); - ExFreePool(ReceiveInfo); + if (NT_SUCCESS(Status)) + { + RtlCopyMemory(Buffer, MdlBuffer, Iosb.Information); + *BufferSize = Iosb.Information; + *Address = DN2H(IpAddress->in_addr); + } - return Status; + ExFreePool(MdlBuffer); + ExFreePool(ReceiveInfo); + + return Status; } @@ -695,55 +721,48 @@ VOID TdiSendThread( * Transmits an UDP packet every two seconds to ourselves on the chosen port */ { - KEVENT Event; - PKEVENT Events[2]; - LARGE_INTEGER Timeout; - NTSTATUS Status = STATUS_SUCCESS; - UCHAR Data[40] = "Testing one, two, three, ..."; + KEVENT Event; + PKEVENT Events[2]; + LARGE_INTEGER Timeout; + NTSTATUS Status = STATUS_SUCCESS; + UCHAR Data[40] = "Testing one, two, three, ..."; - if (!OpenError) { - Timeout.QuadPart = 10000000L; /* Second factor */ - Timeout.QuadPart *= 2; /* Number of seconds */ - Timeout.QuadPart = -(Timeout.QuadPart); /* Relative time */ - KeInitializeEvent(&Event, SynchronizationEvent, FALSE); + if (!OpenError) + { + Timeout.QuadPart = 10000000L; /* Second factor */ + Timeout.QuadPart *= 2; /* Number of seconds */ + Timeout.QuadPart = -(Timeout.QuadPart); /* Relative time */ - Events[0] = &StopEvent; - Events[1] = &Event; + KeInitializeEvent(&Event, SynchronizationEvent, FALSE); - while (NT_SUCCESS(Status)) { - /* Wait until timeout or stop flag is set */ - KeWaitForMultipleObjects( - 2, - (PVOID)&Events, - WaitAny, - Executive, - KernelMode, - FALSE, - &Timeout, - NULL); + Events[0] = &StopEvent; + Events[1] = &Event; - if (KeReadStateEvent(&StopEvent) != 0) { - TDI_DbgPrint(MAX_TRACE, ("Received terminate signal...\n")); - break; - } + while (NT_SUCCESS(Status)) + { + /* Wait until timeout or stop flag is set */ + KeWaitForMultipleObjects( 2, (PVOID)&Events, WaitAny, Executive, KernelMode, FALSE, &Timeout, NULL); - DbgPrint("Sending data - '%s'\n", Data); + if (KeReadStateEvent(&StopEvent) != 0) + { + TDI_DbgPrint(MAX_TRACE, ("Received terminate signal...\n")); + break; + } - Status = TdiSendDatagram(TdiTransportObject, - TEST_PORT, - LocalAddress, - Data, - sizeof(Data)); - if (!NT_SUCCESS(Status)) - DbgPrint("Failed sending data (Status = 0x%X)\n", Status); - } - } + DbgPrint("Sending data - '%s'\n", Data); - TDI_DbgPrint(MAX_TRACE, ("Terminating send thread...\n")); + Status = TdiSendDatagram(TdiTransportObject, TEST_PORT, LocalAddress, Data, sizeof(Data)); - KeSetEvent(&SendThreadEvent, 0, FALSE); + if (!NT_SUCCESS(Status)) + DbgPrint("Failed sending data (Status = 0x%X)\n", Status); + } + } - PsTerminateSystemThread(STATUS_SUCCESS); + TDI_DbgPrint(MAX_TRACE, ("Terminating send thread...\n")); + + KeSetEvent(&SendThreadEvent, 0, FALSE); + + PsTerminateSystemThread(STATUS_SUCCESS); } @@ -757,37 +776,41 @@ VOID TdiReceiveThread( * Waits until an UDP packet is received on the chosen endpoint and displays the data */ { - ULONG Address; - UCHAR Data[40]; - ULONG Size; - NTSTATUS Status = STATUS_SUCCESS; + ULONG Address; + UCHAR Data[40]; + ULONG Size; + NTSTATUS Status = STATUS_SUCCESS; - if (!OpenError) { - while (NT_SUCCESS(Status)) { - Size = sizeof(Data); - RtlZeroMemory(Data, Size); + if (!OpenError) + { + while (NT_SUCCESS(Status)) + { + Size = sizeof(Data); + RtlZeroMemory(Data, Size); - Status = TdiReceiveDatagram(TdiTransportObject, - TEST_PORT, - &Address, - Data, - &Size); - if (NT_SUCCESS(Status)) { - DbgPrint("Received data - '%s'\n", Data); - } else - if (Status != STATUS_CANCELLED) { - TDI_DbgPrint(MIN_TRACE, ("Receive error (Status = 0x%X).\n", Status)); - } else { - TDI_DbgPrint(MAX_TRACE, ("IRP was cancelled.\n")); - } - } - } + Status = TdiReceiveDatagram(TdiTransportObject, TEST_PORT, &Address, Data, &Size); - TDI_DbgPrint(MAX_TRACE, ("Terminating receive thread...\n")); + if (NT_SUCCESS(Status)) + { + DbgPrint("Received data - '%s'\n", Data); + } + else + if (Status != STATUS_CANCELLED) + { + TDI_DbgPrint(MIN_TRACE, ("Receive error (Status = 0x%X).\n", Status)); + } + else + { + TDI_DbgPrint(MAX_TRACE, ("IRP was cancelled.\n")); + } + } + } - KeSetEvent(&ReceiveThreadEvent, 0, FALSE); + TDI_DbgPrint(MAX_TRACE, ("Terminating receive thread...\n")); - PsTerminateSystemThread(STATUS_SUCCESS); + KeSetEvent(&ReceiveThreadEvent, 0, FALSE); + + PsTerminateSystemThread(STATUS_SUCCESS); } @@ -799,32 +822,36 @@ VOID TdiOpenThread( * Context = Pointer to context information (event) */ { - NTSTATUS Status; + NTSTATUS Status; - TDI_DbgPrint(MAX_TRACE, ("Called.\n")); + TDI_DbgPrint(MAX_TRACE, ("Called.\n")); - OpenError = TRUE; + OpenError = TRUE; - Status = TdiOpenTransport(UDP_DEVICE_NAME, - TEST_PORT, - &TdiTransport, - &TdiTransportObject); - if (NT_SUCCESS(Status)) { - Status = TdiQueryAddress(TdiTransportObject, &LocalAddress); - if (NT_SUCCESS(Status)) { - OpenError = FALSE; - DbgPrint("Using local IP address 0x%X\n", LocalAddress); - } else { - TDI_DbgPrint(MIN_TRACE, ("Unable to determine local IP address.\n")); - } - } else - TDI_DbgPrint(MIN_TRACE, ("Cannot open transport (Status = 0x%X).\n", Status)); + Status = TdiOpenTransport(UDP_DEVICE_NAME, TEST_PORT, &TdiTransport, &TdiTransportObject); - TDI_DbgPrint(MAX_TRACE, ("Setting close event.\n")); + if (NT_SUCCESS(Status)) + { + Status = TdiQueryAddress(TdiTransportObject, &LocalAddress); - KeSetEvent((PKEVENT)Context, 0, FALSE); + if (NT_SUCCESS(Status)) + { + OpenError = FALSE; + DbgPrint("Using local IP address 0x%X\n", LocalAddress); + } + else + { + TDI_DbgPrint(MIN_TRACE, ("Unable to determine local IP address.\n")); + } + } + else + TDI_DbgPrint(MIN_TRACE, ("Cannot open transport (Status = 0x%X).\n", Status)); - TDI_DbgPrint(MIN_TRACE, ("Leaving.\n")); + TDI_DbgPrint(MAX_TRACE, ("Setting close event.\n")); + + KeSetEvent((PKEVENT)Context, 0, FALSE); + + TDI_DbgPrint(MIN_TRACE, ("Leaving.\n")); } @@ -836,30 +863,22 @@ VOID TdiUnload( * DriverObject = Pointer to a driver object for this driver */ { - TDI_DbgPrint(MAX_TRACE, ("Setting stop flag\n")); + TDI_DbgPrint(MAX_TRACE, ("Setting stop flag\n")); - KeSetEvent(&StopEvent, 0, FALSE); + KeSetEvent(&StopEvent, 0, FALSE); - /* Wait for send thread to stop */ - KeWaitForSingleObject(&SendThreadEvent, - Executive, - KernelMode, - FALSE, - NULL); + /* Wait for send thread to stop */ + KeWaitForSingleObject(&SendThreadEvent, Executive, KernelMode, FALSE, NULL); - ObDereferenceObject(SendThreadObject); + ObDereferenceObject(SendThreadObject); - /* Wait for receive thread to stop */ - KeWaitForSingleObject(&ReceiveThreadEvent, - Executive, - KernelMode, - FALSE, - NULL); + /* Wait for receive thread to stop */ + KeWaitForSingleObject(&ReceiveThreadEvent, Executive, KernelMode, FALSE, NULL); - ObDereferenceObject(ReceiveThreadObject); + ObDereferenceObject(ReceiveThreadObject); - /* Close device */ - TdiCloseDevice(TdiTransport, TdiTransportObject); + /* Close device */ + TdiCloseDevice(TdiTransport, TdiTransportObject); } @@ -879,75 +898,67 @@ DriverEntry( * Status of driver initialization */ { - KEVENT Event; - NTSTATUS Status; - WORK_QUEUE_ITEM WorkItem; + KEVENT Event; + NTSTATUS Status; + WORK_QUEUE_ITEM WorkItem; - KeInitializeEvent(&StopEvent, NotificationEvent, FALSE); - KeInitializeEvent(&SendThreadEvent, NotificationEvent, FALSE); - KeInitializeEvent(&ReceiveThreadEvent, NotificationEvent, FALSE); + KeInitializeEvent(&StopEvent, NotificationEvent, FALSE); + KeInitializeEvent(&SendThreadEvent, NotificationEvent, FALSE); + KeInitializeEvent(&ReceiveThreadEvent, NotificationEvent, FALSE); - KeInitializeEvent(&Event, SynchronizationEvent, FALSE); - ExInitializeWorkItem(&WorkItem, TdiOpenThread, &Event); - ExQueueWorkItem(&WorkItem, DelayedWorkQueue); + /* Call TdiOpenThread() */ + KeInitializeEvent(&Event, SynchronizationEvent, FALSE); + ExInitializeWorkItem(&WorkItem, TdiOpenThread, &Event); + ExQueueWorkItem(&WorkItem, DelayedWorkQueue); + KeWaitForSingleObject(&Event, Executive, KernelMode, TRUE, NULL); - KeWaitForSingleObject(&Event, - Executive, - KernelMode, - TRUE, - NULL); + /* Create a UDP send thread that sends a dgram every 2 seconds */ + Status = PsCreateSystemThread(&SendThread, /* Thread handle */ + 0, /* Desired access */ + NULL, /* Object attributes */ + NULL, /* Process handle */ + NULL, /* Client id */ + (PKSTART_ROUTINE)TdiSendThread, /* Start routine */ + NULL); /* Start context */ + if (!NT_SUCCESS(Status)) + { + TDI_DbgPrint(MIN_TRACE, ("PsCreateSystemThread() failed for send thread (Status = 0x%X).\n", Status)); + return STATUS_INSUFFICIENT_RESOURCES; + } - Status = PsCreateSystemThread(&SendThread, /* Thread handle */ - 0, /* Desired access */ - NULL, /* Object attributes */ - NULL, /* Process handle */ - NULL, /* Client id */ - (PKSTART_ROUTINE)TdiSendThread, /* Start routine */ - NULL); /* Start context */ - if (!NT_SUCCESS(Status)) { - TDI_DbgPrint(MIN_TRACE, ("PsCreateSystemThread() failed for send thread (Status = 0x%X).\n", Status)); - return STATUS_INSUFFICIENT_RESOURCES; - } + /* Get a pointer to the thread object */ + ObReferenceObjectByHandle(SendThread, THREAD_ALL_ACCESS, NULL, KernelMode, &SendThreadObject, NULL); - /* Get a pointer to the thread object */ - ObReferenceObjectByHandle(SendThread, - THREAD_ALL_ACCESS, - NULL, - KernelMode, - &SendThreadObject, - NULL); + /* Create a UDP receive thread */ + Status = PsCreateSystemThread(&ReceiveThread, /* Thread handle */ + 0, /* Desired access */ + NULL, /* Object attributes */ + NULL, /* Process handle */ + NULL, /* Client id */ + (PKSTART_ROUTINE)TdiReceiveThread, /* Start routine */ + NULL); /* Start context */ + if (!NT_SUCCESS(Status)) + { + TDI_DbgPrint(MIN_TRACE, ("PsCreateSystemThread() failed for receive thread (Status = 0x%X).\n", Status)); + ZwClose(SendThread); + ObDereferenceObject(SendThreadObject); /* deref the extra ref we took above */ + return STATUS_INSUFFICIENT_RESOURCES; + } - Status = PsCreateSystemThread(&ReceiveThread, /* Thread handle */ - 0, /* Desired access */ - NULL, /* Object attributes */ - NULL, /* Process handle */ - NULL, /* Client id */ - (PKSTART_ROUTINE)TdiReceiveThread, /* Start routine */ - NULL); /* Start context */ - if (!NT_SUCCESS(Status)) { - TDI_DbgPrint(MIN_TRACE, ("PsCreateSystemThread() failed for receive thread (Status = 0x%X).\n", Status)); - ZwClose(SendThread); - return STATUS_INSUFFICIENT_RESOURCES; - } + /* Get a pointer to the thread object */ + ObReferenceObjectByHandle(ReceiveThread, THREAD_ALL_ACCESS, NULL, KernelMode, &ReceiveThreadObject, NULL); - /* Get a pointer to the thread object */ - ObReferenceObjectByHandle(ReceiveThread, - THREAD_ALL_ACCESS, - NULL, - KernelMode, - &ReceiveThreadObject, - NULL); + /* Don't need these for anything, so we might as well close them now. + The threads will call PsTerminateSystemThread themselves when they are done */ + ZwClose(SendThread); + ZwClose(ReceiveThread); - /* Don't need these for anything, so we might as well close them now. - The threads will call PsTerminateSystemThread themselves when they are done */ - ZwClose(SendThread); - ZwClose(ReceiveThread); + DriverObject->DriverUnload = (PDRIVER_UNLOAD)TdiUnload; - DriverObject->DriverUnload = (PDRIVER_UNLOAD)TdiUnload; - - return STATUS_SUCCESS; + return STATUS_SUCCESS; } /* EOF */ +