Всем добрый день

Есть код 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. В чем может быть проблема?