lanyu826
驱动小牛
驱动小牛
  • 注册日期2006-03-22
  • 最后登录2009-02-27
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望114点
  • 贡献值0点
  • 好评度113点
  • 原创分0分
  • 专家分0分
阅读:1422回复:3

创建TCP连接的问题

楼主#
更多 发布于:2007-04-24 18:15
  如何用TDI创建一个TCP的连接?
只有UDP的例子,谁能给我说一下思路,最好能有例子
lanyu826
驱动小牛
驱动小牛
  • 注册日期2006-03-22
  • 最后登录2009-02-27
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望114点
  • 贡献值0点
  • 好评度113点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-26 13:40
自己找到一个例子,
5个步骤
1Create a Local Address Object
2Create a TDI Endpoint with Context
3Associate an Endpoint with a Local Address
4Connect to a Remote Server (Send the TCP Handshake)
5Send Data to a Remote Server
试着写了一下,DDK可以编译过去了,不过一调用就重启机器,郁闷
lanyu826
驱动小牛
驱动小牛
  • 注册日期2006-03-22
  • 最后登录2009-02-27
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望114点
  • 贡献值0点
  • 好评度113点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-27 17:44
在最后Send data to a Remote Server时IoCallDriver总是返回错,Status是0xC0000184
代码如下,谁知道哪个地方有问题?
NTSTATUS    TDISendData(PDEVICE_OBJECT DeviceObject,PIRP Irp)
{
    PIRP                pIrp;
    PMDL                pMdl;
    ULONG                SendBfrLength;
    PVOID                pSendBuffer;
    KEVENT                Event;
    NTSTATUS            Status;
    IO_STATUS_BLOCK        IoStatus;
    PDEVICE_EXTENSION    deviceExtension;

    deviceExtension = ( PDEVICE_EXTENSION )DeviceObject->DeviceExtension;

    KeInitializeEvent(&Event, NotificationEvent, FALSE);
    
    pIrp = TdiBuildInternalDeviceControlIrp(TDI_SEND,
                deviceExtension->TDILowerDeviceObject,
                deviceExtension->lpTransAddrFileObject1,
                &Event,        
                &IoStatus          );

    if(NULL==pIrp) {
        DbgPrint("Could not get an IRP for TDI_SEND");
        return(STATUS_INSUFFICIENT_RESOURCES);
    }

    // This code is necessary if buffer is in the paged pool.
    // Must run at <= DISPATCH_LEVEL.
    pSendBuffer = MmGetMdlVirtualAddress ( Irp->MdlAddress );
    SendBfrLength = MmGetMdlByteCount( Irp->MdlAddress );
    
    ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );
    pMdl = IoAllocateMdl(pSendBuffer, SendBfrLength, FALSE, FALSE, pIrp);
    if(NULL==pMdl) {
        DbgPrint("Could not get an MDL for TDI_SEND");
        return(STATUS_INSUFFICIENT_RESOURCES);
    }

   // Must run at < DISPATCH_LEVEL for pageable memory.
    ASSERT( KeGetCurrentIrql() < DISPATCH_LEVEL );

    __try
   {
    MmProbeAndLockPages(
        pMdl,      // (Try to) fix buffer.
        KernelMode,
        IoModifyAccess );
    }

   __except(EXCEPTION_EXECUTE_HANDLER)
   {
    DbgPrint("Exception calling MmProbeAndLockPages");
    return STATUS_UNSUCCESSFUL;
    }

    TdiBuildSend(
        pIrp,
        deviceExtension->TDILowerDeviceObject,     // TDI driver's device object
        deviceExtension->lpTransAddrFileObject1,    // connection (endpoint) file object
        NULL,           // I/O completion routine
        NULL,           // context for I/O completion routine
        pMdl,           // MDL address
        0,              // Flags. 0 => send as normal TSDU.
        SendBfrLength   // length of buffer mapped by MDL
        );

    ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL );

    // Send the command to the underlying TDI driver.
    Status = IoCallDriver(deviceExtension->TDILowerDeviceObject,  pIrp);
    // Wait on the IRP, if required.
    if (Status == STATUS_PENDING) {
        DbgPrint("Waiting on IRP (send)...");
        KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,0);
    }

    if ( (Status != STATUS_SUCCESS) && (Status != STATUS_PENDING)) {  
        DbgPrint("IoCallDriver failed (send), status 0x%08X", Status);
        return STATUS_UNSUCCESSFUL;
    }

    return Status;
}
lanyu826
驱动小牛
驱动小牛
  • 注册日期2006-03-22
  • 最后登录2009-02-27
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望114点
  • 贡献值0点
  • 好评度113点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-28 15:41
问题解决了,先IoAllocateMdl,再TdiBuildInternalDeviceControlIrp
游客

返回顶部