Сервер (TDI),BSOD при конекте...
От: Zoya_Pobeda  
Дата: 31.01.07 04:29
Оценка:
Здраствуйте
Пытаюсь создать сервер на TDI уровне.Вариант отработанный т.е. работает без проблем если запущен в отдельном процессе.Но если я пытаюсь создать сервер в потоке драйвера, а прослушку на TDI_ACCEPT в отдельном потоке то при конекте происходит BSOD.

NTSTATUS ServerThreadStart(PDEVICE_EXTENSION  Context)
{
    NTSTATUS                status        = STATUS_SUCCESS;
    PTDICLIENT                pTDIclient    = (PTDICLIENT)Context->pTDIClient;
    PDEVICE_EXTENSION    pDevExt        = (PDEVICE_EXTENSION)pTDIclient->pDevExt;

    HANDLE                    hThread;

    

    InitIPAddress(    &pTDIclient->pTDIClient->LocalAddress,
                    INADDR_ANY,
                    pTDIclient->port);

    status = TDIClnOpenTransAddr(                    
                                    TCP_DEVICE_NAME_W,
                                    pTDIclient->pTDIClient,
                                    &pTDIclient->pTDIClient->hAddr,
                                    &pTDIclient->pTDIClient->pAddrFileObj
                                 );

    if( !NT_SUCCESS( status ) )
    {
        return status;
    }

    pTDIclient->pTDIClient->pTDIClnConnArr =                       
        (pTDIClnConn)ExAllocatePool(
                                   NonPagedPool,
                                   sizeof(TDIClnConn)
                                  );

    if( NULL == pTDIclient->pTDIClient->pTDIClnConnArr )
    {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto STerrorOpenConnection;
    }

    pTDIclient->pTDIClient->pTDIClnConnArr->pDevExt = pTDIclient->pTDIClient;
    pTDIclient->pTDIClient->pTDIClnConnArr->hConn = INVALID_HANDLE_VALUE;


    status = TDIClnOpenConnEndPt(    TCP_DEVICE_NAME_W,
                                    &pTDIclient->pTDIClient->pTDIClnConnArr->hConn,
                                    &pTDIclient->pTDIClient->pTDIClnConnArr->pConnFileObj,
                                    pTDIclient->pTDIClient->pTDIClnConnArr);

    if( !NT_SUCCESS( status ) )
    {
        goto STerrorOpenConnectionEndpoint;
    }

    pTDIclient->pTDIClient->pTcpDevObj = IoGetRelatedDeviceObject(pTDIclient->pTDIClient->pAddrFileObj);

    KeInitializeEvent(&pTDIclient->pTDIClient->pTDIClnConnArr->AccEvent, NotificationEvent, FALSE);                               // Initialize Accept event.
    KeInitializeEvent(&pTDIclient->pTDIClient->pTDIClnConnArr->DiscEvent, NotificationEvent, FALSE);


    status =                                       
        TDIClnSetEventHandler    (
                                pTDIclient->pTDIClient->pAddrFileObj,
                                pTDIclient->pTDIClient->pTcpDevObj,
                                TDI_EVENT_RECEIVE,
                                TDISrvEventReceive,      
                                NULL                    
                                );

    if( !NT_SUCCESS( status ) )
    {
        goto STerrorEvent;
    }

    status =                                         
        TDIClnSetEventHandler    (
                                pTDIclient->pTDIClient->pAddrFileObj,
                                pTDIclient->pTDIClient->pTcpDevObj,
                                TDI_EVENT_DISCONNECT,
                                TDISrvEventDisconnect,      
                                NULL                    
                                );

    if( !NT_SUCCESS( status ) )
    {
        goto STerrorEvent;
    }

    status =                                         
        TDIClnSetEventHandler    (
                                pTDIclient->pTDIClient->pAddrFileObj,
                                pTDIclient->pTDIClient->pTcpDevObj,
                                TDI_EVENT_ERROR_EX,
                                TDISrvEventErrorEx,   
                                NULL                
                                );

    if( !NT_SUCCESS( status ) )
    {
        goto STerrorEvent;
    }

    status = TDIClnAssocAddr(                     
                                 pTDIclient->pTDIClient->pTDIClnConnArr->pConnFileObj,
                                 pTDIclient->pTDIClient->pTcpDevObj,
                                 pTDIclient->pTDIClient->hAddr
                                );

    if( !NT_SUCCESS( status ) )
    {
        goto STerrorEvent;
    }

    

    status = PsCreateSystemThread(    &hThread,     
                                    0L,               
                                    NULL,             
                                    NULL,             
                                    NULL,             
                                    ServerWorkerThread, 
                                    (PVOID )pTDIclient  
                                    );

    if( !NT_SUCCESS( status ) )
    {
        goto STerrorServerWorkerThread;
    }

    status = ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL, KernelMode,
                                       &pDevExt->pWorkerThread, NULL);

    if ( !NT_SUCCESS( status ) )
    {
        goto STerrorServerWorkerThread;
    }
    else
        ZwClose(hThread);


    return status;


STerrorServerWorkerThread:
    pTDIclient->pTDIClient->pIrpAccept->IoStatus.Information = 0;
    pTDIclient->pTDIClient->pIrpAccept->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest(pTDIclient->pTDIClient->pIrpAccept, IO_NO_INCREMENT);

    TDIClnDisassocAddr(pTDIclient->pTDIClient->pTDIClnConnArr->pConnFileObj, pTDIclient->pTDIClient->pTcpDevObj);


STerrorEvent:
    if (INVALID_HANDLE_VALUE != pTDIclient->pTDIClient->pTDIClnConnArr->hConn) // Opened transport address?
     {
         ZwClose(pTDIclient->pTDIClient->pTDIClnConnArr->hConn);
         pTDIclient->pTDIClient->pTDIClnConnArr->hConn = INVALID_HANDLE_VALUE;
     }

     if (NULL != pTDIclient->pTDIClient->pTDIClnConnArr->pConnFileObj) 
     {
         ObDereferenceObject(pTDIclient->pTDIClient->pTDIClnConnArr->pConnFileObj);
         pTDIclient->pTDIClient->pTDIClnConnArr->pConnFileObj = NULL;
     }

STerrorOpenConnectionEndpoint:
    ExFreePool( pTDIclient->pTDIClient->pTDIClnConnArr );


STerrorOpenConnection:
     if (INVALID_HANDLE_VALUE != pTDIclient->pTDIClient->hAddr) 
     {
         ZwClose(pTDIclient->pTDIClient->hAddr);
         pTDIclient->pTDIClient->hAddr = INVALID_HANDLE_VALUE;
     }

     if (NULL!=pTDIclient->pTDIClient->pAddrFileObj) 
     {
         ObDereferenceObject(pTDIclient->pTDIClient->pAddrFileObj);
         pTDIclient->pTDIClient->pAddrFileObj = NULL;
     }

    return status;
}

VOID ServerWorkerThread(IN PTDICLIENT Context)
{
    NTSTATUS                status        = STATUS_SUCCESS;
    PDEVICE_EXTENSION    pDevExt        = (PDEVICE_EXTENSION)Context->pDevExt;

    PVOID                    pEvents[3];

    PIRP                    pIrp        = NULL;
    IO_STATUS_BLOCK            IoStatus;

    ULONG                        IPAddrWkSz;
    PVOID                        pLclConnIPInfo = NULL;
    PTDI_CONNECTION_INFORMATION pServerConn = NULL;
    PTDI_CONNECTION_INFORMATION pClientConn = NULL;
    PTA_IP_ADDRESS                pLclServerInfo = NULL;                 
    PTA_IP_ADDRESS                pRmtClientInfo = NULL;

    IPAddrWkSz =     (2*sizeof(TDI_CONNECTION_INFORMATION)) +    
                        (2*sizeof(TA_IP_ADDRESS)); 

    pLclConnIPInfo = (pConnParms)ExAllocatePool(NonPagedPool, IPAddrWkSz);

    if (NULL==pLclConnIPInfo)
    {
        KdPrint((".TDIClnExecServer:  Couldn't get storage\n"));
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto SWTerrorEvent;
    }

    memset(pLclConnIPInfo, 0, IPAddrWkSz);           
    pServerConn =  (PTDI_CONNECTION_INFORMATION)pLclConnIPInfo; 
    pClientConn =  (PTDI_CONNECTION_INFORMATION)&pServerConn[1];
    pLclServerInfo = (PTA_IP_ADDRESS)&pServerConn[2];                
    pRmtClientInfo = (PTA_IP_ADDRESS)&pLclServerInfo[1];             

    pRmtClientInfo->TAAddressCount = 1;
    pRmtClientInfo->Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP;
    pRmtClientInfo->Address[0].AddressType = TDI_ADDRESS_TYPE_IP;

    pClientConn->RemoteAddressLength = sizeof(TA_IP_ADDRESS);
    pClientConn->RemoteAddress = pRmtClientInfo;

    Context->pTDIClient->pTDIClnConnArr->pClientConnInfo = pClientConn;
    
    
    
    pIrp = TdiBuildInternalDeviceControlIrp(TDI_ACCEPT,
                            Context->pTDIClient->pTcpDevObj,    
                            Context->pTDIClient->pTDIClnConnArr->pConnFileObj,
                            &Context->pTDIClient->pTDIClnConnArr->AccEvent, 
                            &IoStatus               
                            );

    if (NULL==pIrp)
    {
        KdPrint(("Error TdiBuildInternalDeviceControlIrp"));
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto SWTerrorBuildTDIAccept;
    }

    Context->pTDIClient->pIrpAccept = pIrp;   
                   
    status =                                         
            TDIClnSetEventHandler(    Context->pTDIClient->pAddrFileObj,
                                    Context->pTDIClient->pTcpDevObj,
                                    TDI_EVENT_CONNECT,
                                    TDISrvEventConnect,
                                    Context->pTDIClient->pTDIClnConnArr              
                                    );

    if (!NT_SUCCESS(status))
    {
        KdPrint(("Error TDIClnSetEventHandler: TDI_EVENT_CONNECT status = 0x%08X\n", status));
        goto SWTerrorBuildTDIAccept;
    }

    pEvents[0] = (PVOID)&Context->pTDIClient->pTDIClnConnArr->AccEvent;
    pEvents[1] = (PVOID)&Context->pTDIClient->pTDIClnConnArr->DiscEvent;
    pEvents[2] = (PVOID)&pDevExt->Tdi_Write;

    while(pDevExt->bWriteThreadAlive)
    {
        

        switch(KeWaitForMultipleObjects(3, (PVOID)pEvents, WaitAny, Executive, KernelMode, FALSE, NULL, NULL))
        {
        case 0:
            {
                KeResetEvent(&Context->pTDIClient->pTDIClnConnArr->AccEvent);
                break;
            }
        case 1:
            {
                pIrp = TdiBuildInternalDeviceControlIrp(TDI_ACCEPT,
                            Context->pTDIClient->pTcpDevObj,    
                            Context->pTDIClient->pTDIClnConnArr->pConnFileObj,
                            &Context->pTDIClient->pTDIClnConnArr->AccEvent, 
                            &IoStatus               
                            );

                if (NULL==pIrp)
                {
                    KdPrint(("Error TdiBuildInternalDeviceControlIrp"));
                    status = STATUS_INSUFFICIENT_RESOURCES;
                    pDevExt->bWriteThreadAlive = FALSE;
                    break;
                }

                Context->pTDIClient->pIrpAccept = pIrp;

                break;
            }
        case 2:
            {
                break;
            }
        }
    }

    Context->pTDIClient->pIrpAccept->IoStatus.Information = 0;
    Context->pTDIClient->pIrpAccept->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest(Context->pTDIClient->pIrpAccept, IO_NO_INCREMENT);

    

    if (NULL!=pLclConnIPInfo)
        ExFreePool(pLclConnIPInfo);



SWTerrorBuildTDIAccept:
    TDIClnDisassocAddr(Context->pTDIClient->pTDIClnConnArr->pConnFileObj, Context->pTDIClient->pTcpDevObj);


SWTerrorEvent:
    if (INVALID_HANDLE_VALUE != Context->pTDIClient->pTDIClnConnArr->hConn) 
     {
         ZwClose(Context->pTDIClient->pTDIClnConnArr->hConn);
         Context->pTDIClient->pTDIClnConnArr->hConn = INVALID_HANDLE_VALUE;
     }

     if (NULL != Context->pTDIClient->pTDIClnConnArr->pConnFileObj) 
     {
         ObDereferenceObject(Context->pTDIClient->pTDIClnConnArr->pConnFileObj);
         Context->pTDIClient->pTDIClnConnArr->pConnFileObj = NULL;
     }

    ExFreePool( Context->pTDIClient->pTDIClnConnArr );



     if (INVALID_HANDLE_VALUE != Context->pTDIClient->hAddr) 
     {
         ZwClose(Context->pTDIClient->hAddr);
         Context->pTDIClient->hAddr = INVALID_HANDLE_VALUE;
     }

     if (NULL!=Context->pTDIClient->pAddrFileObj) 
     {
         ObDereferenceObject(Context->pTDIClient->pAddrFileObj);
         Context->pTDIClient->pAddrFileObj = NULL;
     }
}


извиняюсь за излишнее цетирование,но как говорится дьявол в мелочах. Ну я все уже облазила..
Re: Сервер (TDI),BSOD при конекте...
От: TarasCo  
Дата: 31.01.07 07:22
Оценка:
Здравствуйте, Zoya_Pobeda, Вы писали:

Z_P>Здраствуйте

Z_P>Пытаюсь создать сервер на TDI уровне.Вариант отработанный т.е. работает без проблем если запущен в отдельном процессе.Но если я пытаюсь создать сервер в потоке драйвера, а прослушку на TDI_ACCEPT в отдельном потоке то при конекте происходит BSOD.

Не могли бы Вы подробно указать место, где происходит BSOD? Я могу предположить, что это происходит в ф. TDISrvEventConnect, а ее код вы не привели.
Да пребудет с тобою сила
Re[2]: Сервер (TDI),BSOD при конекте...
От: Zoya_Pobeda  
Дата: 31.01.07 08:35
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Не могли бы Вы подробно указать место, где происходит BSOD? Я могу предположить, что это происходит в ф. TDISrvEventConnect, а ее код вы не привели.


Да собственно как я понимаю стандартная комбинация...


NTSTATUS
TDISrvEventConnect(
                   PVOID                pEventCtx,    // Event context.
                   LONG                 lnRmtAddr,    // Buffer length.
                   PVOID                pRmtClnTA,    // Buffer (transport address of remote client).
                   LONG                 lnUserData,   // Length of user data buffer.
                   PVOID                pUserData,    // User data buffer.
                   LONG                 lnOptions,    // Length of options.
                   PVOID                pOptions,     // Options buffer.
                   CONNECTION_CONTEXT * ppConnCtx,    // Output connection context.
                   PIRP               * ppIrp         // Output Irp address.
                  )
{
    pTDIClnConn                    pLclConn = (pTDIClnConn)pEventCtx;
    pTDIClientExtension            pDevExt = pLclConn->pDevExt;  
    PTDI_CONNECTION_INFORMATION    pClientConn = pLclConn->pClientConnInfo;
    PTA_IP_ADDRESS                pClientConnInfo = (PTA_IP_ADDRESS)pClientConn->RemoteAddress;           
    PTA_IP_ADDRESS                pTAAddrIp = (PTA_IP_ADDRESS)pRmtClnTA;                  

    pClientConnInfo->Address[0].Address[0].in_addr = pTAAddrIp->Address[0].Address[0].in_addr;   
    
    pClientConnInfo->Address[0].Address[0].sin_port = pTAAddrIp->Address[0].Address[0].sin_port;   
   

    TdiBuildAccept(pDevExt->pIrpAccept,                  
                    pDevExt->pTcpDevObj,
                    pLclConn->pConnFileObj,
                    TDIClnIoCompRtnAcc,                   
                    pDevExt,                              
                    pClientConn,                         
                    NULL
                    );

    IoSetNextIrpStackLocation(pDevExt->pIrpAccept);      

    *ppIrp = pDevExt->pIrpAccept;                        

    *ppConnCtx = (CONNECTION_CONTEXT)pLclConn;           
                                                     



    return STATUS_MORE_PROCESSING_REQUIRED;
}
Re[3]: Сервер (TDI),BSOD при конекте...
От: TarasCo  
Дата: 31.01.07 11:41
Оценка:
Здравствуйте, Zoya_Pobeda, Вы писали:

Вы так и не написали ни место где произошел BSOD, ни даже его кода. Кроме того, Вы скорее свего не включали Driver Verifier — а он мог бы показать более точную причину ошибку. Поэтому, придется угадывать причину ошибки. Конечно мы попробуем , но это может продолжать очень долго.

Итак, первая возможная причина.
1. В коде ф.ServerWorkerThread есть такие строки:



    pIrp = TdiBuildInternalDeviceControlIrp(TDI_ACCEPT,
                            Context->pTDIClient->pTcpDevObj,    
                            Context->pTDIClient->pTDIClnConnArr->pConnFileObj,
                            &Context->pTDIClient->pTDIClnConnArr->AccEvent, 
                            &IoStatus               
                            );

   Context->pTDIClient->pIrpAccept = pIrp;


Это Вы загодя создаете Irp. Причем этот объект довольно хитрый — он связан с очередью потока, поскольку TdiBuildInternalDeviceControlIrp — всего лишь макрос-оболочка над IoBuildDeviceIoControlRequest ( обязательно читаем описание!!! ). Теперь, мы принимаем входящее соединение ( ф.TDISrvEventConnect ) и производим с Irp некое действие:

    TdiBuildAccept(pDevExt->pIrpAccept,                  
                    pDevExt->pTcpDevObj,
                    pLclConn->pConnFileObj,
                    TDIClnIoCompRtnAcc,                   
                    pDevExt,                              
                    pClientConn,                         
                    NULL
                    );


Я так понял, что pIrpAccept это Irp, созданный вызовом TdiBuildInternalDeviceControlIrp? Тогда с ним поступили довольно нехорошо — подменили процедуру завершения, указанную при создании и контекст. При этом на мой взгляд все, что происходит дальше — это неопределенное поведении и BSOD не удивителен. Что нужно было сделать? Нужно было в ф.TDISrvEventConnect создать собственный Irp простым вызовом IoAllocateIrp и инициализировать его через макрос TdiBuildAccept. В ф. TDIClnIoCompRtnAcc — освободить через вызов IoFreeIrp, там же взвести нотифицирующее событие.
Да пребудет с тобою сила
Re[4]: Сервер (TDI),BSOD при конекте...
От: Zoya_Pobeda  
Дата: 31.01.07 13:33
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Здравствуйте, Zoya_Pobeda, Вы писали:


TC>Вы так и не написали ни место где произошел BSOD, ни даже его кода. Кроме того, Вы скорее свего не включали Driver Verifier — а он мог бы показать более точную причину ошибку. Поэтому, придется угадывать причину ошибки. Конечно мы попробуем , но это может продолжать очень долго.


Хорошо исправлюсь

Так можно?Дело в том что это отработанный вариан, пока жил(более года, 5-10 презагрузок за все это время) в отдельном потоке все было хорошо...

TDIClnIoCompRtnAcc(
                   PDEVICE_OBJECT       pDevObj,      // TDI driver's device object.
                   PIRP                 pIrp,         // Address of completed Irp.
                   PVOID                pCtx          // Pointer to context.
                  )
{

    pTDIClientExtension pDevExt = (pTDIClientExtension)pCtx;                       
                       

    pDevExt->pIrpAccept = NULL;                         

    if (STATUS_SUCCESS!= pIrp->IoStatus.Status)
    {
        KdPrint((".TDIClnIoCompRtnAcc:  IoStatus.Status = 0x%08x, IoStatus.Information = 0x%08x\n",
              pIrp->IoStatus.Status, pIrp->IoStatus.Information));
    }

    return STATUS_SUCCESS;
}
Re[5]: Сервер (TDI),BSOD при конекте...
От: TarasCo  
Дата: 31.01.07 14:13
Оценка:
Здравствуйте, Zoya_Pobeda, Вы писали:

Z_P>Хорошо исправлюсь


Зоя, блин, где BSOD???? Напиши, после какой строчки кода све падает?

Z_P>Так можно?Дело в том что это отработанный вариан, пока жил(более года, 5-10 презагрузок за все это время) в отдельном потоке все было хорошо...


Ну, для начала гарантирована утечка ресурсов — кто будет освобождать IRP? Во-вторых, при завершении потока в котором была вызвана ф. TdiBuildInternalDeviceControlIrp может что-то случиться — Вы ведь там в IRP кой-чего подправили. То, что у сервера большой аптайм ниочем не говорит — может просто повезло. Driver Verifier включали?
Да пребудет с тобою сила
Re[6]: Сервер (TDI),BSOD при конекте...
От: Аноним  
Дата: 31.01.07 15:21
Оценка:
Здравствуйте, TarasCo, Вы писали:



TC>Зоя, блин, где BSOD???? Напиши, после какой строчки кода све падает?


TarasCo а как посмотреть, SoftIce-ом я так и не научилась пользоваться...



TC>Ну, для начала гарантирована утечка ресурсов — кто будет освобождать IRP? Во-вторых, при завершении потока в котором была вызвана ф. TdiBuildInternalDeviceControlIrp может что-то случиться — Вы ведь там в IRP кой-чего подправили. То, что у сервера большой аптайм ниочем не говорит — может просто повезло. Driver Verifier включали?


Точно IRP я освобожу.Включала машина зверски тормозит, не возможно работать, перезагрузилась SafeMode вырубила его..
Re[7]: Сервер (TDI),BSOD при конекте...
От: TarasCo  
Дата: 31.01.07 16:42
Оценка:
Здравствуйте, Аноним, Вы писали:

TC>>Зоя, блин, где BSOD???? Напиши, после какой строчки кода све падает?


А>TarasCo а как посмотреть, SoftIce-ом я так и не научилась пользоваться...


После BSOD а должен остаться минидамп — его можно открыть в windbg — он покажет стек во время падения + всякую диагностику. Кроме того, каким нибудь отладчиком нужно научиться пользоваться. Если есть вторая машина — лучше пользуйтесь windbg.

А>Точно IRP я освобожу.Включала машина зверски тормозит, не возможно работать, перезагрузилась SafeMode вырубила его..


Так Вы не можете его освобождать — раз выделяли через TdiBuildInternalDeviceControlIrp — система сама должна его освободить
Да пребудет с тобою сила
Re[8]: Сервер (TDI),BSOD при конекте...
От: Denwer Россия  
Дата: 01.02.07 10:52
Оценка: 1 (1) +1
Здравствуйте, TarasCo, Вы писали:

убедительная просьба следить за объемом цитирования — модератор

Даже если и нет второй машины, то работать с WinDbg с виртуальной машиной намного приятнее чем с СофтАйсом, во время отладки есть возможность полазить по докам например.
[от модератора] убедительная просьба следить за объемом цити
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 01.02.07 15:56
Оценка:
бан на 1 день
... << RSDN@Home 1.2.0 alpha rev. 655>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[4]: Сервер (TDI),BSOD при конекте...
От: Zoya_Pobeda  
Дата: 08.02.07 14:31
Оценка:
Здравствуйте, TarasCo, Вы писали:

Извиняюсь за долгое молчание — грипповала
Может я вас не правильно поняла...,но что то у меня что странное твориться стало...
Windbg-ер у меня запустиь не удалось,что бы посмотреть что бы проанализировать дамп-файл,Verifiry тоже какойто кривой выбираю драйвер для ставлю его на проверку,перезагружаюсь...а он не проверяется...Вообщем какаято я не везучая
Но зато я по немногу осваеваю софтАйс, и вот что я выяснела...BSOD происходит уже после выхода и ф-ии TDIClnIoCompRtnAcc, а там уже АСМ и пнять что там происходит я непойму

TarasCo правильно ли я вас поняла?


NTSTATUS
TDISrvEventConnect(
                   PVOID                pEventCtx, 
                   LONG                 lnRmtAddr, 
                   PVOID                pRmtClnTA,   
                   LONG                 lnUserData,   
                   PVOID                pUserData,   
                   LONG                 lnOptions,   
                   PVOID                pOptions,    
                   CONNECTION_CONTEXT * ppConnCtx,    
                   PIRP               * ppIrp        
                  )
{
    pTDIClnConn                    pLclConn = (pTDIClnConn)pEventCtx;               pTDIClientExtension            pTDIDevExt  = (pTDIClientExtension)pLclConn->pTDIDevExt;  
    P_DEVICE_EXTENSION        pDevExt    = (P_DEVICE_EXTENSION)pTDIDevExt->pDevExt;
    PDEVICE_OBJECT                pTDIDeviceObject;
    PTDI_CONNECTION_INFORMATION    pClientConn = pLclConn->pClientConnInfo;        
    PTA_IP_ADDRESS                pClientConnInfo = (PTA_IP_ADDRESS)pClientConn->RemoteAddress;          
    PTA_IP_ADDRESS                pTAAddrIp = (PTA_IP_ADDRESS)pRmtClnTA;                 

    pClientConnInfo->Address[0].Address[0].in_addr = pTAAddrIp->Address[0].Address[0].in_addr;    
    
    pClientConnInfo->Address[0].Address[0].sin_port = pTAAddrIp->Address[0].Address[0].sin_port;   
   

    pTDIDeviceObject = IoGetRelatedDeviceObject(
                        pLclConn->pConnFileObj
                        );

    pLclConn->pIrpAccept = IoAllocateIrp(pTDIDeviceObject->StackSize, FALSE);



    TdiBuildAccept(pLclConn->pIrpAccept,                  
                    pTDIDevExt->pTcpDevObj,
                    pLclConn->pConnFileObj,
                    TDIClnIoCompRtnAcc,                   
                    pTDIDevExt,                              
                    pClientConn,                         
                    NULL
                    );

    IoSetNextIrpStackLocation(pLclConn->pIrpAccept);      

    *ppIrp = pLclConn->pIrpAccept;                        

    *ppConnCtx = (CONNECTION_CONTEXT)pLclConn;           
                                                      

    KdPrint(("%S --> function CONNECT",&pDevExt->symbolicLinkName.Buffer[12]));

    return STATUS_MORE_PROCESSING_REQUIRED;
} 
NTSTATUS
TDIClnIoCompRtnAcc(
                   PDEVICE_OBJECT       pDevObj,      
                   PIRP                 pIrp,         
                   PVOID                pCtx         
                  )
{

    pTDIClientExtension pDevExt        = (pTDIClientExtension)pCtx;
    pTDIClnConn            pLclConn    = (pTDIClnConn)pDevExt->pTDIClnConnArr;
                       

    IoFreeIrp( pLclConn->pIrpAccept );
    pLclConn->pIrpAccept = NULL;                          

    if (STATUS_SUCCESS!= pIrp->IoStatus.Status)
    {
        KdPrint((".TDIClnIoCompRtnAcc:  IoStatus.Status = 0x%08x, IoStatus.Information = 0x%08x\n",
              pIrp->IoStatus.Status, pIrp->IoStatus.Information));
    }

    return STATUS_SUCCESS;
}
Re[5]: Сервер (TDI),BSOD при конекте...
От: TarasCo  
Дата: 08.02.07 20:00
Оценка:
Z_P>TarasCo правильно ли я вас поняла?
Зоя, Вы меня поняли правильно. Только из TDIClnIoCompRtnAcc необходимо вернуть STATUS_MORE_PROCESSING_REQUIRED, иначе система попытается продолжить завершение IRP вверх по стеку, что приведет к ошибке — ведь в данном случае вы на верхушке.

Z_P>Windbg-ер у меня запустиь не удалось,что бы посмотреть что бы проанализировать дамп-файл,Verifiry тоже какойто кривой выбираю драйвер для ставлю его на проверку,перезагружаюсь...а он не проверяется...Вообщем какаято я не везучая


Вы случайно не в понедельник родились? . Что значит не удалось запустить? Для анализа дамп-файла не нужно никаких особых ухищрений. Запускаете windbg — появляется окно. Дальше в меню файл выбирается соответствующая опция. Если окно не появляется — у Вас какая то проблема с системой — большая вероятность, что система заражена вирусом. На счет верифаера — попробуйте поэкспериментировать, если не получится — создайте отдельныю тему в форуме с подробным описание что и как.

Z_P>Но зато я по немногу осваеваю софтАйс, и вот что я выяснела...BSOD происходит уже после выхода и ф-ии TDIClnIoCompRtnAcc, а там уже АСМ и пнять что там происходит я непойму


Первое дело — нужно научиться просматривать стек. Как правило в нем будет где-нибудь вызов из вашего кода, скорее всего ошибка там. Если уж взялись за айс — разберитесь ОБЯЗАТЕЛЬНО со следующими вопросом: загрузка отладочных символов и трассировка по исходному коду. Я тут не помощник — айсом не пользовался уже два года, на память уже ничего не помню.

Z_P> Извиняюсь за долгое молчание — грипповала

С выздоровлением
Да пребудет с тобою сила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.