TDI: получаю 0, а не свой локальный IP
От: eboev  
Дата: 29.04.09 08:48
Оценка:
Всем добрый день
Есть код TDI драйвера :
/* this completion routine queries address and port from address object */
NTSTATUS
tdi_create_addrobj_complete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
{
    
    NTSTATUS status;
    PIO_STACK_LOCATION irps = IoGetCurrentIrpStackLocation(Irp);
    PIRP query_irp = (PIRP)Context;
    PDEVICE_OBJECT devobj;
    
    PMDL mdl = NULL;

    //TDI_CREATE_ADDROBJ2_CTX *ctx = NULL;
    TDI_ADDRESS_INFO * ctx = NULL;

    if(addrobj_completeBreak)
        DbgBreakPoint();
  
  if (Irp->IoStatus.Status != STATUS_SUCCESS) {
        status = Irp->IoStatus.Status;
        goto done;
    }
    
    // query addrobj address:port

    ctx = (TDI_ADDRESS_INFO *)malloc_np(TDI_ADDRESS_INFO_MAX);
    if (ctx == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto done;
    }

    mdl = IoAllocateMdl(ctx, TDI_ADDRESS_INFO_MAX, FALSE, FALSE, NULL);
    if (mdl == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto done;
    }
    MmBuildMdlForNonPagedPool(mdl);

    /*ctx = (TDI_CREATE_ADDROBJ2_CTX *)malloc_np(sizeof(TDI_CREATE_ADDROBJ2_CTX));
    if (ctx == NULL) {
        
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto done;
    }
    ctx->fileobj = irps->FileObject;

    ctx->tai = (TDI_ADDRESS_INFO *)malloc_np(TDI_ADDRESS_INFO_MAX);
    if (ctx->tai == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto done;
    }

    mdl = IoAllocateMdl(ctx->tai, TDI_ADDRESS_INFO_MAX, FALSE, FALSE, NULL);
    if (mdl == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto done;
    }
    MmBuildMdlForNonPagedPool(mdl);*/

    devobj = get_original_devobj(DeviceObject, NULL);    // use original devobj!
    if (devobj == NULL) {
        status = STATUS_INVALID_PARAMETER;
        goto done;
    }
    
    //я пробовал явно установить, но это не помогает
    //ctx->tai->Address.Address->AddressType = TDI_ADDRESS_TYPE_IP;
    ctx->Address.Address->AddressType = TDI_ADDRESS_TYPE_IP;

    TdiBuildQueryInformation(query_irp, devobj, irps->FileObject,
        tdi_create_addrobj_complete2, ctx,
        TDI_QUERY_ADDRESS_INFO, mdl);

    status = IoCallDriver(devobj, query_irp);
    query_irp = NULL;
    mdl = NULL;
    ctx = NULL;

    if (status != STATUS_SUCCESS) {
        goto done;
    }

    status = STATUS_SUCCESS;

done:
    // cleanup
    if (mdl != NULL)
        IoFreeMdl(mdl);
        
    if (query_irp != NULL)
        IoCompleteRequest(query_irp, IO_NO_INCREMENT);

    Irp->IoStatus.Status = status;
    
    if (status != STATUS_SUCCESS) {
        // tdi_create failed - remove fileobj from hash
        //ot_del_fileobj(irps->FileObject, NULL);
    }

    return tdi_generic_complete(DeviceObject, Irp, Context);
}

/* this completion routine gets address and port from reply to TDI_QUERY_ADDRESS_INFO */
typedef struct {
    PFILE_OBJECT    fileobj;        /* address object */
    PVOID            old_handler;    /* old event handler */
    PVOID            old_context;    /* old event handler context */
} TDI_EVENT_CONTEXT_NEW;

// max event index
#ifdef TDI_EVENT_ERROR_EX
// 2k
#    define MAX_EVENT    (TDI_EVENT_ERROR_EX + 1)
#else
// NT4
#    define MAX_EVENT    (TDI_EVENT_CHAINED_RECEIVE_EXPEDITED + 1)
#endif

struct ot_entry {
    ULONG signature;
    struct ot_entry        *next;
    
    ULONG                pid;
    
    PDEVICE_OBJECT        devobj;
    PFILE_OBJECT        fileobj;
    PFILE_OBJECT        associated_fileobj;
    
    int                    type;
    
    TDI_EVENT_CONTEXT_NEW    ctx[MAX_EVENT];
    UCHAR                local_addr[TA_ADDRESS_MAX];
    UCHAR                remote_addr[TA_ADDRESS_MAX];

    CONNECTION_CONTEXT    conn_ctx;
};

NTSTATUS
tdi_create_addrobj_complete2(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
{
    NTSTATUS status;
    /*TDI_CREATE_ADDROBJ2_CTX *ctx = (TDI_CREATE_ADDROBJ2_CTX *)Context;
    TA_ADDRESS *addr = ctx->tai->Address.Address;*/
    TDI_ADDRESS_INFO *ctx = (TDI_ADDRESS_INFO *)Context;
    TA_ADDRESS *addr = ctx->Address.Address;
    
    struct ot_entry *ote;
    KIRQL irql;
    
    if(addrobj_complete2Break)
        DbgBreakPoint();

    //вот где происходит получение порта и айпи адреса
    
    KdPrint(("[tdi_fw] tdi_create_addrobj_complete2: address: %u:%u\n", 
         ntohl(((TDI_ADDRESS_IP *)(addr->Address))->in_addr),
         ntohs(((TDI_ADDRESS_IP *)(addr->Address))->sin_port)));

    // save address

    status = STATUS_SUCCESS;
done:
    // cleanup MDL
    if (Irp->MdlAddress) {
        IoFreeMdl(Irp->MdlAddress);
        Irp->MdlAddress = NULL;
    }

    //free(ctx->tai);
    free(ctx);

    // success anyway
    return STATUS_SUCCESS;
}


Проблема в том, что при установке соединения код:

    KdPrint(("[tdi_fw] tdi_create_addrobj_complete2: address: %u:%u\n", 
         ntohl(((TDI_ADDRESS_IP *)(addr->Address))->in_addr),
         ntohs(((TDI_ADDRESS_IP *)(addr->Address))->sin_port)));

дает in_addr равный 0, а порт достоверный. Я смотрел процесс в TCPView, и in_addr должен совпадать с моим локальным IP. В чем может быть проблема?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.