Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
0
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;
}
Ejemplo n.º 10
0
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;
}
Ejemplo n.º 11
0
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;
}
Ejemplo n.º 12
0
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;
}