NTSTATUS LpxTdiDisassociateAddress( IN PFILE_OBJECT ConnectionFileObject ) { PDEVICE_OBJECT deviceObject; PIRP irp; KEVENT event; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; LtDebugPrint (3, ("[LpxTdi] LpxTdiDisassociateAddress: Entered\n")); // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_DISASSOCIATE_ADDRESS, deviceObject, ConnectionFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi] TdiDisassociateAddress: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } TdiBuildDisassociateAddress( irp, deviceObject, ConnectionFileObject, NULL, NULL ); irp->MdlAddress = NULL; ntStatus = LpxTdiIoCallDriver( deviceObject, irp, NULL, NULL, TRUE); #if DBG if(ntStatus != STATUS_SUCCESS) { LtDebugPrint(1, ("[LpxTdi] TdiDisassociateAddress: Failed. STATUS=%08lx\n", ntStatus)); } #endif return ntStatus; }
NTSTATUS LpxTdiConnect( IN PFILE_OBJECT ConnectionFileObject, IN PTDI_ADDRESS_LPX Address ) { KEVENT event; PDEVICE_OBJECT deviceObject; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; UCHAR buffer[ FIELD_OFFSET(TRANSPORT_ADDRESS, Address) + FIELD_OFFSET(TA_ADDRESS, Address) + TDI_ADDRESS_LENGTH_LPX ]; PTRANSPORT_ADDRESS serverTransportAddress; PTA_ADDRESS taAddress; PTDI_ADDRESS_LPX addressName; NTSTATUS ntStatus; TDI_CONNECTION_INFORMATION connectionInfomation; LtDebugPrint (3, ("[LpxTdi] LpxTdiConnect: Entered\n")); // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_CONNECT, deviceObject, connectionFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi]TdiConnect: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } serverTransportAddress = (PTRANSPORT_ADDRESS)buffer; serverTransportAddress->TAAddressCount = 1; taAddress = (PTA_ADDRESS)serverTransportAddress->Address; taAddress->AddressType = TDI_ADDRESS_TYPE_LPX; taAddress->AddressLength = TDI_ADDRESS_LENGTH_LPX; addressName = (PTDI_ADDRESS_LPX)taAddress->Address; RtlCopyMemory( addressName, Address, TDI_ADDRESS_LENGTH_LPX ); // // Make Connection Info... // RtlZeroMemory( &connectionInfomation, sizeof(TDI_CONNECTION_INFORMATION) ); connectionInfomation.UserDataLength = 0; connectionInfomation.UserData = NULL; connectionInfomation.OptionsLength = 0; connectionInfomation.Options = NULL; connectionInfomation.RemoteAddress = serverTransportAddress; connectionInfomation.RemoteAddressLength = FIELD_OFFSET(TRANSPORT_ADDRESS, Address) + FIELD_OFFSET(TA_ADDRESS, Address) + TDI_ADDRESS_LENGTH_LPX; TdiBuildConnect( irp, deviceObject, ConnectionFileObject, NULL, NULL, NULL, &connectionInfomation, NULL ); irp->MdlAddress = NULL; ntStatus = LpxTdiIoCallDriver( deviceObject, irp, &ioStatusBlock, &event, NULL ); if(!NT_SUCCESS(ntStatus)) { LtDebugPrint(1, ("[LpxTdi]TdiConnect: Failed.\n")); } return ntStatus; }
NTSTATUS LpxTdiAssociateAddress( IN PFILE_OBJECT ConnectionFileObject, IN HANDLE AddressFileHandle ) { KEVENT event; PDEVICE_OBJECT deviceObject; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; LtDebugPrint (3, ("[LpxTdi] LpxTdiAssociateAddress: Entered\n")); // // Make Event. // KeInitializeEvent( &event, NotificationEvent, FALSE ); deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_ASSOCIATE_ADDRESS, deviceObject, ConnectionFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi] LpxTdiAssociateAddress: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } TdiBuildAssociateAddress( irp, deviceObject, ConnectionFileObject, NULL, NULL, AddressFileHandle ); irp->MdlAddress = NULL; ntStatus = LpxTdiIoCallDriver( deviceObject, irp, &ioStatusBlock, &event, NULL ); if(!NT_SUCCESS(ntStatus)) { LtDebugPrint(1, ("[LpxTdi] LpxTdiAssociateAddress: Failed.\n")); } return ntStatus; }
NTSTATUS LpxTdiSetReceiveDatagramHandler( IN PFILE_OBJECT AddressFileObject, IN PVOID InEventHandler, IN PVOID InEventContext ) { PDEVICE_OBJECT deviceObject; PIRP irp; KEVENT event; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; LtDebugPrint (1, ("[LxpTdi]LpxSetReceiveDatagramHandler: Entered\n")); // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(AddressFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_SET_EVENT_HANDLER, deviceObject, AddressFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi]LpxSetReceiveDatagramHandler: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } TdiBuildSetEventHandler( irp, deviceObject, AddressFileObject, NULL, NULL, TDI_EVENT_RECEIVE_DATAGRAM, InEventHandler, InEventContext ); ntStatus = LpxTdiIoCallDriver( deviceObject, irp, &ioStatusBlock, &event, NULL ); if(!NT_SUCCESS(ntStatus)) { LtDebugPrint(1, ("[LpxTdi]LpxSetReceiveDatagramHandler: Can't Build IRP.\n")); } LtDebugPrint(3, ("[LpxTdi] Leave LpxSetReceiveDatagramHandler\n")); return ntStatus; }
NTSTATUS LpxTdiSendDataGram( IN PFILE_OBJECT AddressFileObject, PLPX_ADDRESS LpxRemoteAddress, IN PUCHAR SendBuffer, IN ULONG SendLength, IN ULONG Flags, OUT PLONG Result ) { KEVENT event; PDEVICE_OBJECT deviceObject; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; PMDL mdl; TDI_CONNECTION_INFORMATION SendDatagramInfo; UCHAR AddrBuffer[256]; PTRANSPORT_ADDRESS RemoteAddress = (PTRANSPORT_ADDRESS)AddrBuffer; UNREFERENCED_PARAMETER(Flags); LtDebugPrint (3, ("LpxTdiSendDataGram: Entered\n")); // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(AddressFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_SEND_DATAGRAM, deviceObject, AddressFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi]LpxTdiSendDataGram: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } // // Make MDL. // mdl = IoAllocateMdl( SendBuffer, SendLength, FALSE, FALSE, irp ); if(mdl == NULL) { LtDebugPrint(1, ("[LpxTdi]LpxTdiSendDataGram: Can't Allocate MDL.\n")); return STATUS_INSUFFICIENT_RESOURCES; } MmBuildMdlForNonPagedPool(mdl); mdl->Next = NULL; // MmProbeAndLockPages( // mdl, // KernelMode, // IoReadAccess // ); RemoteAddress->TAAddressCount = 1; RemoteAddress->Address[0].AddressType = TDI_ADDRESS_TYPE_LPX; RemoteAddress->Address[0].AddressLength = TDI_ADDRESS_LENGTH_LPX; RtlCopyMemory(RemoteAddress->Address[0].Address, LpxRemoteAddress, sizeof(LPX_ADDRESS)); SendDatagramInfo.UserDataLength = 0; SendDatagramInfo.UserData = NULL; SendDatagramInfo.OptionsLength = 0; SendDatagramInfo.Options = NULL; SendDatagramInfo.RemoteAddressLength = TPADDR_LPX_LENGTH; SendDatagramInfo.RemoteAddress = RemoteAddress; TdiBuildSendDatagram( irp, deviceObject, AddressFileObject, LpxTdiSendCompletionRoutine, NULL, mdl, SendLength, &SendDatagramInfo ); ntStatus = LpxTdiIoCallDriver( deviceObject, irp, &ioStatusBlock, &event, NULL ); if(!NT_SUCCESS(ntStatus)) { LtDebugPrint(1, ("[LpxTdi]LpxTdiSendDataGram: Failed.\n")); *Result = -1; return ntStatus; } *Result = ioStatusBlock.Information; return ntStatus; }
NTSTATUS LpxTdiRecv_TimeOut( IN PFILE_OBJECT ConnectionFileObject, OUT PUCHAR RecvBuffer, IN ULONG RecvLength, IN ULONG Flags, IN PLONG Result, IN PLARGE_INTEGER TimeOut ) { KEVENT event; PDEVICE_OBJECT deviceObject; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; PMDL mdl; if((RecvBuffer == NULL) || (RecvLength == 0)) { LtDebugPrint(1, ("[LpxTdi]TdiReceive: Rcv buffer == NULL or RcvLen == 0.\n")); return STATUS_INSUFFICIENT_RESOURCES; } LtDebugPrint (3, ("LpxTdiRecv: Entered\n")); // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_RECEIVE, deviceObject, connectionFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi]TdiReceive: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } /* try { // // Make MDL. // */ mdl = IoAllocateMdl( RecvBuffer, RecvLength, FALSE, FALSE, irp ); if(mdl == NULL) { LtDebugPrint(1, ("[LpxTdi]TdiReceive: Can't Allocate MDL.\n")); return STATUS_INSUFFICIENT_RESOURCES; } mdl->Next = NULL; MmBuildMdlForNonPagedPool(mdl); /* MmProbeAndLockPages( mdl, KernelMode, IoWriteAccess ); } except (EXCEPTION_EXECUTE_HANDLER) { LtDebugPrint(1, ("[LpxTdi]TdiReceive: Can't Convert Non-Paged Memory MDL.\n")); if(mdl){ IoFreeMdl(mdl); //IoFreeIrp(irp); } return STATUS_INSUFFICIENT_RESOURCES; } */ TdiBuildReceive( irp, deviceObject, ConnectionFileObject, LpxTdiRcvCompletionRoutine, NULL, mdl, Flags, RecvLength ); ntStatus = LpxTdiIoCallDriver( deviceObject, irp, &ioStatusBlock, &event, TimeOut ); if(!NT_SUCCESS(ntStatus)) { LtDebugPrint(1, ("[LpxTdi]LpxTdiRecv: Failed.\n")); *Result = -1; return ntStatus; } *Result = ioStatusBlock.Information; return ntStatus; }
NTSTATUS LpxTdiSendEx( IN PFILE_OBJECT ConnectionFileObject, IN PUCHAR SendBuffer, IN ULONG SendLength, IN ULONG Flags, IN PKEVENT CompEvent, IN PLARGE_INTEGER TimeOut, IN OUT PVOID CompletionContext, OUT PIO_STATUS_BLOCK IoStatusBlock ) { PDEVICE_OBJECT deviceObject; PIRP irp; NTSTATUS ntStatus; PMDL mdl; LtDebugPrint (3, ("[LPXTDI]LpxTdiSendEx: Entered\n")); deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_SEND, deviceObject, ConnectionFileObject, CompEvent, IoStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi]LpxTdiSendEx: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } mdl = IoAllocateMdl( SendBuffer, SendLength, FALSE, FALSE, irp ); if(mdl == NULL) { LtDebugPrint(1, ("[LpxTdi]LpxTdiSendEx: Can't Allocate MDL.\n")); return STATUS_INSUFFICIENT_RESOURCES; } mdl->Next = NULL; MmBuildMdlForNonPagedPool(mdl); if(CompletionContext) { TdiBuildSend( irp, deviceObject, ConnectionFileObject, LpxTdiSendCompletionRoutine, CompletionContext, mdl, Flags, SendLength ); } else { TdiBuildSend( irp, deviceObject, ConnectionFileObject, NULL, NULL, mdl, Flags, SendLength ); } ntStatus = LpxTdiIoCallDriver( deviceObject, irp, IoStatusBlock, CompEvent, TimeOut ); if(!NT_SUCCESS(ntStatus)) { LtDebugPrint(1, ("[LpxTdi]LpxTdiSendEx: Failed.\n")); } return ntStatus; }
NTSTATUS LpxTdiSend_TimeOut( IN PFILE_OBJECT ConnectionFileObject, IN PUCHAR SendBuffer, IN ULONG SendLength, IN ULONG Flags, OUT PLONG Result, IN PLARGE_INTEGER TimeOut ) { KEVENT event; PDEVICE_OBJECT deviceObject; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; PMDL mdl; LtDebugPrint (3, ("LpxTdiSend: Entered\n")); // // Send bytes is restricted below 64 KBytes. // Removed. // Now NDAS service will control request data size. // Write size will be controlled by retransmits // SendLength = SendLength > LPXTDI_BYTEPERPACKET?LPXTDI_BYTEPERPACKET:SendLength; // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_SEND, deviceObject, ConnectionFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi]TdiSend: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } /* try { // // Make MDL. // */ mdl = IoAllocateMdl( SendBuffer, SendLength, FALSE, FALSE, irp ); if(mdl == NULL) { LtDebugPrint(1, ("[LpxTdi]TdiSend: Can't Allocate MDL.\n")); return STATUS_INSUFFICIENT_RESOURCES; } mdl->Next = NULL; MmBuildMdlForNonPagedPool(mdl); /* MmProbeAndLockPages( mdl, KernelMode, IoReadAccess ); } except (EXCEPTION_EXECUTE_HANDLER) { LtDebugPrint(1, ("[LpxTdi]TdiSend: Can't Convert Non-Paged Memory MDL.\n")); if(mdl){ IoFreeMdl(mdl); } return STATUS_INSUFFICIENT_RESOURCES; } if(!MmIsNonPagedSystemAddressValid(MmGetMdlVirtualAddress(mdl))) { if(mdl){ IoFreeMdl(mdl); }; return STATUS_INSUFFICIENT_RESOURCES; } */ TdiBuildSend( irp, deviceObject, ConnectionFileObject, LpxTdiSendCompletionRoutine, NULL, mdl, Flags, SendLength ); ntStatus = LpxTdiIoCallDriver( deviceObject, irp, &ioStatusBlock, &event, TimeOut ); if(!NT_SUCCESS(ntStatus)) { LtDebugPrint(1, ("[LpxTdi]LpxTdiSend: Failed.\n")); *Result = -1; return ntStatus; } *Result = ioStatusBlock.Information; return ntStatus; }
NTSTATUS LpxTdiDisconnect( IN PFILE_OBJECT ConnectionFileObject, IN ULONG Flags ) { PDEVICE_OBJECT deviceObject; PIRP irp; KEVENT event; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; LtDebugPrint (3, ("LpxTdiDisconnect: Entered\n")); ASSERT(ConnectionFileObject); // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_DISCONNECT, deviceObject, ConnectionFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi]KSTdiDisconnect: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } TdiBuildDisconnect( irp, deviceObject, ConnectionFileObject, NULL, NULL, NULL, Flags, NULL, NULL ); irp->MdlAddress = NULL; ntStatus = LpxTdiIoCallDriver( deviceObject, irp, &ioStatusBlock, &event, NULL ); if(!NT_SUCCESS(ntStatus)) { LtDebugPrint(1, ("[LpxTdi]LpxTdiDisconnect: Failed. ntStatus = %x\n", ntStatus)); } return ntStatus; }
NTSTATUS LpxTdiRecv_LSTrans( IN PFILE_OBJECT ConnectionFileObject, OUT PUCHAR RecvBuffer, IN ULONG RecvLength, IN ULONG Flags, IN PLARGE_INTEGER TimeOut, OUT PLS_TRANS_STAT TransStat, OUT PLONG Result, IN PLSTRANS_OVERLAPPED OverlappedData ){ KEVENT event; PDEVICE_OBJECT deviceObject; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; PMDL mdl; BOOLEAN synch; PTRANS_STAT transStat; LtDebugPrint (3, ("LpxTdiRecv_LSTrans: Entered\n")); // // Parameter check // if(OverlappedData) { if(TransStat || Result) { return STATUS_INVALID_PARAMETER; } transStat = (PTRANS_STAT)OverlappedData->TransStat; synch = FALSE; } else { transStat = (PTRANS_STAT)TransStat; synch = TRUE; } if((RecvBuffer == NULL) || (RecvLength == 0)) { LtDebugPrint(1, ("[LpxTdi] LpxTdiRecv_LSTrans: Rcv buffer == NULL or RcvLen == 0.\n")); return STATUS_INSUFFICIENT_RESOURCES; } deviceObject = IoGetRelatedDeviceObject(ConnectionFileObject); // // Make IRP. // if(synch) { KeInitializeEvent(&event, NotificationEvent, FALSE); irp = TdiBuildInternalDeviceControlIrp( TDI_RECEIVE, deviceObject, connectionFileObject, &event, &ioStatusBlock ); } else { irp = TdiBuildInternalDeviceControlIrp( TDI_RECEIVE, deviceObject, connectionFileObject, NULL, NULL ); } if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi] LpxTdiRecv_LSTrans: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } mdl = IoAllocateMdl( RecvBuffer, RecvLength, FALSE, FALSE, irp ); if(mdl == NULL) { LtDebugPrint(1, ("[LpxTdi] LpxTdiRecv_LSTrans: Can't Allocate MDL.\n")); return STATUS_INSUFFICIENT_RESOURCES; } MmBuildMdlForNonPagedPool(mdl); TdiBuildReceive( irp, deviceObject, ConnectionFileObject, IrpCompletionForUserNotification, OverlappedData, mdl, Flags, RecvLength ); ntStatus = LpxTdiIoCallDriver( deviceObject, irp, transStat, TimeOut, synch ); if(synch) { if(ntStatus == STATUS_SUCCESS) { ntStatus = RtlULongPtrToLong(ioStatusBlock.Information, Result); ASSERT(NT_SUCCESS(ntStatus)); } else { LtDebugPrint(1, ("[LpxTdi] LpxTdiRecv_LSTrans: Failed. STATUS=%08lx\n", ntStatus)); *Result = 0; } } #if DBG else { if(ntStatus != STATUS_SUCCESS && ntStatus != STATUS_PENDING) { LtDebugPrint(1, ("[LpxTdi] LpxTdiSend_LSTrans: Failed. STATUS=%08lx\n", ntStatus)); } } #endif return ntStatus; }
NTSTATUS LpxSetDisconnectHandler( IN PFILE_OBJECT AddressFileObject, IN PVOID InEventHandler, IN PVOID InEventContext ) { PDEVICE_OBJECT deviceObject; PIRP irp; KEVENT event; IO_STATUS_BLOCK ioStatusBlock; NTSTATUS ntStatus; LtDebugPrint (3, ("[LpxTdi] LpxSetDisconnectHandler: Entered\n")); // // Make Event. // KeInitializeEvent(&event, NotificationEvent, FALSE); deviceObject = IoGetRelatedDeviceObject(AddressFileObject); // // Make IRP. // irp = TdiBuildInternalDeviceControlIrp( TDI_SET_EVENT_HANDLER, deviceObject, AddressFileObject, &event, &ioStatusBlock ); if(irp == NULL) { LtDebugPrint(1, ("[LpxTdi] LpxSetDisconnectHandler: Can't Build IRP.\n")); return STATUS_INSUFFICIENT_RESOURCES; } TdiBuildSetEventHandler( irp, deviceObject, AddressFileObject, NULL, NULL, TDI_EVENT_DISCONNECT, InEventHandler, InEventContext ); ntStatus = LpxTdiIoCallDriver( deviceObject, irp, NULL, NULL, TRUE ); #if DBG if(ntStatus != STATUS_SUCCESS) { LtDebugPrint(1, ("[LpxTdi] LpxSetDisconnectHandler: Failed.\n")); } #endif return ntStatus; }
NTSTATUS LpxTdiQueryInformation( IN PFILE_OBJECT ConnectionFileObject, IN ULONG QType, IN PVOID Buffer, IN ULONG BufferLen ) { NTSTATUS status; KEVENT event; PDEVICE_OBJECT deviceObject; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; PMDL mdl; if (QType != TDI_QUERY_CONNECTION_INFO) return STATUS_NOT_IMPLEMENTED; if (BufferLen != sizeof(TDI_CONNECTION_INFO)) return STATUS_INVALID_PARAMETER; LtDebugPrint (3, ("[LpxTdi] LpxTdiQueryInformation: Entered\n")); KeInitializeEvent( &event, NotificationEvent, FALSE ); deviceObject = IoGetRelatedDeviceObject( ConnectionFileObject ); irp = TdiBuildInternalDeviceControlIrp( TDI_QUERY_INFORMATION, deviceObject, connectionFileObject, &event, &ioStatusBlock ); if (irp == NULL) { LtDebugPrint( 1, ("[LpxTdi] LpxTdiQueryInformation: Can't Build IRP.\n") ); return STATUS_INSUFFICIENT_RESOURCES; } mdl = IoAllocateMdl( Buffer, BufferLen, FALSE, FALSE, irp ); if (mdl == NULL) { LtDebugPrint( 1, ("[LpxTdi] LpxTdiQueryInformation: Can't Allocate MDL.\n") ); IoFreeIrp( irp ); return STATUS_INSUFFICIENT_RESOURCES; } MmBuildMdlForNonPagedPool( mdl ); TdiBuildQueryInformation( irp, deviceObject, ConnectionFileObject, LpxTdiQueryInformationCompletionRoutine, NULL, QType, mdl ); status = LpxTdiIoCallDriver( deviceObject, irp, NULL, NULL, TRUE ); #if DBG if (status != STATUS_SUCCESS) { LtDebugPrint(1, ("[LpxTdi]LpxTdiQueryInformation: Failed. STATUS=%08lx\n", status)); } #endif return status; }