Fixes for bugs previously posted in bugzilla.

svn path=/trunk/; revision=7469
This commit is contained in:
Art Yerkes 2004-01-06 03:44:38 +00:00
parent e2bc674743
commit 5662831f38
2 changed files with 60 additions and 12 deletions

View file

@ -368,21 +368,46 @@ NTSTATUS AfdDispSendTo(
#if 0 #if 0
#ifdef _MSC_VER #ifdef _MSC_VER
try { try {
#endif #endif
MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess); MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
#ifdef _MSC_VER #ifdef _MSC_VER
} except(EXCEPTION_EXECUTE_HANDLER) { } except(EXCEPTION_EXECUTE_HANDLER) {
AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
IoFreeMdl(Mdl); IoFreeMdl(Mdl);
if (BufferSize != 0) { if (BufferSize != 0) {
ExFreePool(SystemVirtualAddress); ExFreePool(SystemVirtualAddress);
} }
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
#endif #endif
#endif #endif
if (!FCB->TdiAddressObject) {
struct sockaddr_in BindName;
RtlZeroMemory(&BindName,sizeof(BindName));
BindName.sin_family = AF_INET;
Status = TdiOpenAddressFile
(&FCB->TdiDeviceName,
(SOCKADDR *)&BindName,
&FCB->TdiAddressObjectHandle,
&FCB->TdiAddressObject);
if (NT_SUCCESS(Status)) {
AfdRegisterEventHandlers(FCB);
FCB->State = SOCKET_STATE_BOUND;
Reply->Status = NO_ERROR;
} else {
//FIXME: WSAEADDRNOTAVAIL
Reply->Status = WSAEINVAL;
MmUnlockPages(Mdl);
IoFreeMdl(Mdl);
return Status;
}
}
Status = TdiSendDatagram(FCB->TdiAddressObject, Status = TdiSendDatagram(FCB->TdiAddressObject,
&Request->To, &Request->To,
Mdl, Mdl,

View file

@ -256,8 +256,10 @@ NTSTATUS TdiCall(
NTSTATUS Status; NTSTATUS Status;
AFD_DbgPrint(MAX_TRACE, ("Called\n")); AFD_DbgPrint(MAX_TRACE, ("Called\n"));
Status = IoCallDriver(DeviceObject, Irp); Status = IoCallDriver(DeviceObject, Irp);
AFD_DbgPrint(MAX_TRACE, ("IoCallDriver: %08x\n", Status));
if ((Status == STATUS_PENDING) && (Event != NULL)) { if ((Status == STATUS_PENDING) && (Event != NULL)) {
AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n")); AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n"));
KeWaitForSingleObject( KeWaitForSingleObject(
@ -1108,12 +1110,17 @@ NTSTATUS TdiSendDatagram(
KEVENT Event; KEVENT Event;
PIRP Irp; PIRP Irp;
AFD_DbgPrint(MAX_TRACE, ("Called.\n"));
DeviceObject = IoGetRelatedDeviceObject(TransportObject); DeviceObject = IoGetRelatedDeviceObject(TransportObject);
if (!DeviceObject) { if (!DeviceObject) {
AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n")); AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n"));
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
AFD_DbgPrint(MAX_TRACE,
("TdiSendDatagram: TansportObject = %08x\n", TransportObject));
TdiAddressSize = TdiAddressSizeFromName(Address); TdiAddressSize = TdiAddressSizeFromName(Address);
ConnectInfo = (PTDI_CONNECTION_INFORMATION) ConnectInfo = (PTDI_CONNECTION_INFORMATION)
@ -1123,18 +1130,28 @@ NTSTATUS TdiSendDatagram(
if (!ConnectInfo) if (!ConnectInfo)
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
AFD_DbgPrint(MAX_TRACE,
("TdiAddressSize = %d, sizeof(TDI_CONNECTION_INFORMATION) = %d\n",
TdiAddressSize, sizeof(TDI_CONNECTION_INFORMATION)));
RtlZeroMemory(ConnectInfo, RtlZeroMemory(ConnectInfo,
sizeof(TDI_CONNECTION_INFORMATION) + sizeof(TDI_CONNECTION_INFORMATION) +
TdiAddressSize); TdiAddressSize);
ConnectInfo->RemoteAddressLength = TdiAddressSize; ConnectInfo->RemoteAddressLength = TdiAddressSize;
ConnectInfo->RemoteAddress = (PVOID) ConnectInfo->RemoteAddress = (PVOID)
(ConnectInfo + sizeof(TDI_CONNECTION_INFORMATION)); (((PCHAR)ConnectInfo) + sizeof(TDI_CONNECTION_INFORMATION));
AFD_DbgPrint(MAX_TRACE, ("Point A\n"));
TdiBuildAddress(ConnectInfo->RemoteAddress, Address); TdiBuildAddress(ConnectInfo->RemoteAddress, Address);
AFD_DbgPrint(MAX_TRACE, ("Point B\n"));
KeInitializeEvent(&Event, NotificationEvent, FALSE); KeInitializeEvent(&Event, NotificationEvent, FALSE);
AFD_DbgPrint(MAX_TRACE, ("Point 0\n"));
Irp = TdiBuildInternalDeviceControlIrp(TDI_SEND_DATAGRAM, /* Sub function */ Irp = TdiBuildInternalDeviceControlIrp(TDI_SEND_DATAGRAM, /* Sub function */
DeviceObject, /* Device object */ DeviceObject, /* Device object */
TransportObject, /* File object */ TransportObject, /* File object */
@ -1146,6 +1163,8 @@ NTSTATUS TdiSendDatagram(
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
} }
AFD_DbgPrint(MAX_TRACE, ("Point 1\n"));
#if 0 #if 0
Mdl = IoAllocateMdl(Buffer, /* Virtual address of buffer */ Mdl = IoAllocateMdl(Buffer, /* Virtual address of buffer */
BufferSize, /* Length of buffer */ BufferSize, /* Length of buffer */
@ -1172,6 +1191,7 @@ NTSTATUS TdiSendDatagram(
#endif #endif
#endif #endif
AFD_DbgPrint(MAX_TRACE, ("TdiBuildSendDatagram()\n"));
TdiBuildSendDatagram(Irp, /* I/O Request Packet */ TdiBuildSendDatagram(Irp, /* I/O Request Packet */
DeviceObject, /* Device object */ DeviceObject, /* Device object */
TransportObject, /* File object */ TransportObject, /* File object */
@ -1180,8 +1200,10 @@ NTSTATUS TdiSendDatagram(
Mdl, /* Descriptor for data buffer */ Mdl, /* Descriptor for data buffer */
BufferSize, /* Size of data to send */ BufferSize, /* Size of data to send */
ConnectInfo); /* Connection information */ ConnectInfo); /* Connection information */
AFD_DbgPrint(MAX_TRACE, ("Returned from TdiBuildSendDatagram\n"));
Status = TdiCall(Irp, DeviceObject, &Event, &Iosb); Status = TdiCall(Irp, DeviceObject, &Event, &Iosb);
AFD_DbgPrint(MAX_TRACE, ("Returned from TdiCall\n"));
#if 0 #if 0
MmUnlockPages(Mdl); MmUnlockPages(Mdl);
@ -1190,6 +1212,7 @@ NTSTATUS TdiSendDatagram(
#endif #endif
ExFreePool(ConnectInfo); ExFreePool(ConnectInfo);
AFD_DbgPrint(MAX_TRACE, ("Leaving %08x.\n", Status));
return Status; return Status;
} }