без TdiBuildAccept ? Как?
От: -CANCER-  
Дата: 28.10.06 12:47
Оценка:
Как же все таки на TDI уровне можно обойтись без TdiBuildAccept?
listen???
Автор: TarasCo
Дата: 21.10.06
Re: без TdiBuildAccept ? Как?
От: TarasCo  
Дата: 28.10.06 17:06
Оценка:
Здравствуйте, -CANCER-, Вы писали:

CAN>Как же все таки на TDI уровне можно обойтись без TdiBuildAccept?

CAN>listen???
Автор: TarasCo
Дата: 21.10.06


Если в двух словах, драйвера, работающие с tcpip.sys ( afd.sys, netbt.sys ) для работы с входящими соединениями используют клиентскую нотификацию — TDI_EVENT_CONNECT. Эта нотификация устанавливается на файл-транспортный адрес.
Да пребудет с тобою сила
Re[2]: без TdiBuildAccept ? Как?
От: Аноним  
Дата: 29.10.06 13:24
Оценка:
Здравствуйте, TarasCo, Вы писали:

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


CAN>>Как же все таки на TDI уровне можно обойтись без TdiBuildAccept?

CAN>>listen???
Автор: TarasCo
Дата: 21.10.06


TC>Если в двух словах, драйвера, работающие с tcpip.sys ( afd.sys, netbt.sys ) для работы с входящими соединениями используют клиентскую нотификацию — TDI_EVENT_CONNECT. Эта нотификация устанавливается на файл-транспортный адрес.


Ок! Спасибо. Буду пробывать. А какие преимущества имеет данный способ? Ведь не зря его используют сервисы. Я так понимаю и сервисы от дяди Билли?

СТОП! А я так и делал но у меня не получалось! Если надо могу превести код.

З.Ы. Т.е. TdiBuildListen тоже не надо использовать?
Re[3]: без TdiBuildAccept ? Как?
От: TarasCo  
Дата: 29.10.06 15:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ок! Спасибо. Буду пробывать. А какие преимущества имеет данный способ? Ведь не зря его используют сервисы. Я так понимаю и сервисы от дяди Билли?


Этот способ могут использовать ТОЛЬКО драйвера режима ядра. Поэтому, если понимать под сервисом также драйвера ( AKA сервисы режима ядра ), то все драйвера — клиенты tcpip.sys делают это. Преимущество одно — производительность.

А>СТОП! А я так и делал но у меня не получалось! Если надо могу превести код.


Прежде всего не расстраивайтесь, не все получается с первого раза. Не останавливайтесь и все получится .

А>З.Ы. Т.е. TdiBuildListen тоже не надо использовать?


Если установили нотификатор — то нет, необязательно, это тольо запутает все дело .


Я бы Вам посоветовал посмотреть, как работают стандартные драйвера — установите драйвер-фильтр, или если есть достаточно опыта, можно просто точек останова расставить. Можно TDIMon использовать, есть такая утилита — ссылку давать не буду, она и гуглом моментом найдется.
Да пребудет с тобою сила
Re[4]: без TdiBuildAccept ? Как?
От: Аноним  
Дата: 03.11.06 14:26
Оценка:
Здравствуйте, TarasCo, Вы писали:

Блин, не получается у меня соединение!Может подскажете где ошибка зарылась? Все примерно так

typedef struct _TDI_HANDLE 
{
    HANDLE hTransport;
    HANDLE hConnection;
    PFILE_OBJECT pfoTransport;
    PFILE_OBJECT pfoConnection;

} TDI_HANDLE, *PTDI_HANDLE;


NTSTATUS TdiFuncs_InitializeServer(PCOMM_DEVICE_EXTENSION pContext)
{
    NTSTATUS NtStatus;
    PTDI_HANDLE pTdiHandle = pContext->pTdiHandle;
    HANDLE hTransport, hConnection;
    PFILE_OBJECT  pfoTransport, pfoConnection;

    NtStatus = TdiFuncs_OpenTransportAddress(&hTransport,
                                             &pfoTransport,
                                             0,//ntohl(pContext->m_address),
                                             ntohs(pContext->m_port));
    if(!NT_SUCCESS(NtStatus))
        goto errorOpenTransportAddress;


    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
                                            TDI_EVENT_RECEIVE,
                                            Tdi_ClientEventReceive,
                                            (PVOID)pContext);

    if(!NT_SUCCESS(NtStatus))
        goto errorSetEventHandler;

    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
                                            TDI_EVENT_DISCONNECT,
                                            Tdi_ClientEventDisconnect,
                                            (PVOID)pContext);

    if(!NT_SUCCESS(NtStatus))
        goto errorSetEventHandler;

    NtStatus = TdiFuncs_OpenConnection(&hConnection, &pfoConnection);

    if(!NT_SUCCESS(NtStatus))
        goto errorOpenConnection;

    NtStatus = TdiFuncs_AssociateTransportAndConnection(hTransport, pfoConnection);

    if(!NT_SUCCESS(NtStatus))
        goto errorAssociateTransportAndConnection;

    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
                                            TDI_EVENT_CONNECT,
                                            Tdi_ClientEventConnect,
                                            (PVOID)pContext);

    if(!NT_SUCCESS(NtStatus))
    {
        goto errorAssociateTransportAndConnection;
    }


    if(NT_SUCCESS(NtStatus))
    {
        pTdiHandle->hConnection   = hConnection;
        pTdiHandle->hTransport    = hTransport;

        pTdiHandle->pfoConnection = pfoConnection;
        pTdiHandle->pfoTransport  = pfoTransport;
    }


    return NtStatus;


errorAssociateTransportAndConnection:
    TdiFuncs_CloseTdiOpenHandle(hConnection, pfoConnection);

errorOpenConnection:
    TdiFuncs_CloseTdiOpenHandle(hTransport, pfoTransport);

errorSetEventHandler:

errorOpenTransportAddress:

    return NtStatus;
}

NTSTATUS
Tdi_ClientEventConnect(
       IN PVOID TdiEventContext,
       IN LONG RemoteAddressLength,
       IN PVOID RemoteAddress,
       IN LONG UserDataLength,
       IN PVOID UserData,
       IN LONG OptionsLength,
       IN PVOID Options,
       OUT CONNECTION_CONTEXT *ConnectionContext,
       OUT PIRP *AcceptIrp
      )
{
    NTSTATUS NtStatus = STATUS_SUCCESS;
    PIRP pIrp;
    PCOMM_DEVICE_EXTENSION pDevExt = (PCOMM_DEVICE_EXTENSION)TdiEventContext;
    PDEVICE_OBJECT pTdiDevice;
    IO_STATUS_BLOCK IoStatusBlock;
    TDI_COMPLETION_CONTEXT TdiCompletionContext;
    TDI_CONNECTION_INFORMATION  RequestConnectionInfo = {0};
    TDI_CONNECTION_INFORMATION  ReturnConnectionInfo  = {0};

    KeWaitForMutexObject(&pDevExt->kConnectionLock, Executive, KernelMode, FALSE, NULL);

    pTdiDevice = IoGetRelatedDeviceObject(pDevExt->pTdiHandle->pfoConnection);


    NdisMoveMemory( &pDevExt->m_RemoteAddress,
                    RemoteAddress,
                    sizeof( TA_IP_ADDRESS ));

    pIrp = TdiBuildInternalDeviceControlIrp(TDI_ACCEPT,
                                            pTdiDevice,
                                            pDevExt->pTdiHandle->pfoConnection,
                                            &TdiCompletionContext.kCompleteEvent,
                                            &IoStatusBlock);

    if(pIrp)
    {
        
        RequestConnectionInfo.UserDataLength = 0;
        RequestConnectionInfo.UserData = NULL;

        RequestConnectionInfo.OptionsLength = 0;
        RequestConnectionInfo.Options = NULL;

        RequestConnectionInfo.RemoteAddressLength = sizeof( TA_IP_ADDRESS );
        RequestConnectionInfo.RemoteAddress = &pDevExt->m_RemoteAddress;


        
        TdiBuildAccept( pIrp, 
                        pTdiDevice,   
                        pDevExt->pTdiHandle->pfoConnection,  
                        NULL,
                        NULL,
                        &RequestConnectionInfo,
                        &ReturnConnectionInfo);



        NtStatus = IoCallDriver(pTdiDevice, pIrp);

        if(NtStatus == STATUS_PENDING)
        {
            KeWaitForSingleObject(&TdiCompletionContext.kCompleteEvent, Executive, KernelMode, FALSE, NULL);
            

            NtStatus = IoStatusBlock.Status;
        }
        else
        {

        *AcceptIrp = pIrp;
        *ConnectionContext = pDevExt;
        pDevExt->csConnectionState = CS_CONNECTED;
        }

    }
    KeReleaseMutex(&pDevExt->kConnectionLock, FALSE);
    return NtStatus;   
}


Вообщем вылетау в BSOD с ошибкой IRQ_NOT_LESS_OR_EQUAL(0x00000000,0x00000002,0x00000001, 0x8042def4)!!!

Множество вариантов перепробывал, не растет кокос!!! Может я не правильно Вас понял?
Re[5]: без TdiBuildAccept ? Как?
От: TarasCo  
Дата: 05.11.06 12:10
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>Блин, не получается у меня соединение!Может подскажете где ошибка зарылась? Все примерно так


А>
А>typedef struct _TDI_HANDLE 
А>{
А>    HANDLE hTransport;
А>    HANDLE hConnection;
А>    PFILE_OBJECT pfoTransport;
А>    PFILE_OBJECT pfoConnection;

А>} TDI_HANDLE, *PTDI_HANDLE;


А>NTSTATUS TdiFuncs_InitializeServer(PCOMM_DEVICE_EXTENSION pContext)
А>{
А>    NTSTATUS NtStatus;
А>    PTDI_HANDLE pTdiHandle = pContext->pTdiHandle;
А>    HANDLE hTransport, hConnection;
А>    PFILE_OBJECT  pfoTransport, pfoConnection;

А>    NtStatus = TdiFuncs_OpenTransportAddress(&hTransport,
А>                                             &pfoTransport,
А>                                             0,//ntohl(pContext->m_address),
А>                                             ntohs(pContext->m_port));
А>    if(!NT_SUCCESS(NtStatus))
А>        goto errorOpenTransportAddress;


А>    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
А>                                            TDI_EVENT_RECEIVE,
А>                                            Tdi_ClientEventReceive,
А>                                            (PVOID)pContext);

А>    if(!NT_SUCCESS(NtStatus))
А>        goto errorSetEventHandler;

А>    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
А>                                            TDI_EVENT_DISCONNECT,
А>                                            Tdi_ClientEventDisconnect,
А>                                            (PVOID)pContext);

А>    if(!NT_SUCCESS(NtStatus))
А>        goto errorSetEventHandler;

А>    NtStatus = TdiFuncs_OpenConnection(&hConnection, &pfoConnection);

А>    if(!NT_SUCCESS(NtStatus))
А>        goto errorOpenConnection;

А>    NtStatus = TdiFuncs_AssociateTransportAndConnection(hTransport, pfoConnection);

А>    if(!NT_SUCCESS(NtStatus))
А>        goto errorAssociateTransportAndConnection;

А>    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
А>                                            TDI_EVENT_CONNECT,
А>                                            Tdi_ClientEventConnect,
А>                                            (PVOID)pContext);

А>    if(!NT_SUCCESS(NtStatus))
А>    {
А>        goto errorAssociateTransportAndConnection;
А>    }


А>    if(NT_SUCCESS(NtStatus))
А>    {
А>        pTdiHandle->hConnection   = hConnection;
А>        pTdiHandle->hTransport    = hTransport;

А>        pTdiHandle->pfoConnection = pfoConnection;
А>        pTdiHandle->pfoTransport  = pfoTransport;
А>    }


А>    return NtStatus;


А>errorAssociateTransportAndConnection:
А>    TdiFuncs_CloseTdiOpenHandle(hConnection, pfoConnection);

А>errorOpenConnection:
А>    TdiFuncs_CloseTdiOpenHandle(hTransport, pfoTransport);

А>errorSetEventHandler:

А>errorOpenTransportAddress:

А>    return NtStatus;
А>}

А>NTSTATUS
А>Tdi_ClientEventConnect(
А>       IN PVOID TdiEventContext,
А>       IN LONG RemoteAddressLength,
А>       IN PVOID RemoteAddress,
А>       IN LONG UserDataLength,
А>       IN PVOID UserData,
А>       IN LONG OptionsLength,
А>       IN PVOID Options,
А>       OUT CONNECTION_CONTEXT *ConnectionContext,
А>       OUT PIRP *AcceptIrp
А>      )
А>{
А>    NTSTATUS NtStatus = STATUS_SUCCESS;
А>    PIRP pIrp;
А>    PCOMM_DEVICE_EXTENSION pDevExt = (PCOMM_DEVICE_EXTENSION)TdiEventContext;
А>    PDEVICE_OBJECT pTdiDevice;
А>    IO_STATUS_BLOCK IoStatusBlock;
А>    TDI_COMPLETION_CONTEXT TdiCompletionContext;
А>    TDI_CONNECTION_INFORMATION  RequestConnectionInfo = {0};
А>    TDI_CONNECTION_INFORMATION  ReturnConnectionInfo  = {0};

А>    KeWaitForMutexObject(&pDevExt->kConnectionLock, Executive, KernelMode, FALSE, NULL);

А>    pTdiDevice = IoGetRelatedDeviceObject(pDevExt->pTdiHandle->pfoConnection);


А>    NdisMoveMemory( &pDevExt->m_RemoteAddress,
А>                    RemoteAddress,
А>                    sizeof( TA_IP_ADDRESS ));

А>    pIrp = TdiBuildInternalDeviceControlIrp(TDI_ACCEPT,
А>                                            pTdiDevice,
А>                                            pDevExt->pTdiHandle->pfoConnection,
А>                                            &TdiCompletionContext.kCompleteEvent,
А>                                            &IoStatusBlock);

А>    if(pIrp)
А>    {
        
А>        RequestConnectionInfo.UserDataLength = 0;
А>        RequestConnectionInfo.UserData = NULL;

А>        RequestConnectionInfo.OptionsLength = 0;
А>        RequestConnectionInfo.Options = NULL;

А>        RequestConnectionInfo.RemoteAddressLength = sizeof( TA_IP_ADDRESS );
А>        RequestConnectionInfo.RemoteAddress = &pDevExt->m_RemoteAddress;


        
А>        TdiBuildAccept( pIrp, 
А>                        pTdiDevice,   
А>                        pDevExt->pTdiHandle->pfoConnection,  
А>                        NULL,
А>                        NULL,
А>                        &RequestConnectionInfo,
А>                        &ReturnConnectionInfo);



А>        NtStatus = IoCallDriver(pTdiDevice, pIrp);

А>        if(NtStatus == STATUS_PENDING)
А>        {
А>            KeWaitForSingleObject(&TdiCompletionContext.kCompleteEvent, Executive, KernelMode, FALSE, NULL);
            

А>            NtStatus = IoStatusBlock.Status;
А>        }
А>        else
А>        {

А>        *AcceptIrp = pIrp;
А>        *ConnectionContext = pDevExt;
А>        pDevExt->csConnectionState = CS_CONNECTED;
А>        }

А>    }
А>    KeReleaseMutex(&pDevExt->kConnectionLock, FALSE);
А>    return NtStatus;   
А>}
А>



А>Вообщем вылетау в BSOD с ошибкой IRQ_NOT_LESS_OR_EQUAL(0x00000000,0x00000002,0x00000001, 0x8042def4)!!!

А>Множество вариантов перепробывал, не растет кокос!!! Может я не правильно Вас понял?

Алогритм правильный, но реализация хромает .

Первое, по поводу отладки — подобные вещи ( BSOD ) при отладке драйвера — рядовое явление, бессмысленно по каждому случаю задавать вопрос. Поставте точку остонова в начало ф.Tdi_ClientEventConnect и протрассируйте код. Узнав точное место ошибки, можно будет и документацию почитать или задать осмысленный вопрос. В данном случае, учитывая факт, что клиентсикие нотификаторы вызываются на DISPATCH_LEVEL, можно указать несколько мест, приводящих к фатальным ошибкам:
— KeWaitForMutexObject — ожидание с ненулевым таймаутом не допустимо
— TdiBuildInternalDeviceControlIr — документация настаивает на вызове только на PASSIVE_LEVEL ( хотя вроде как BSOD а быть не должно )
— KeWaitForSingleObject — ожидание м ненулевым таймаутом не допустимо
Да пребудет с тобою сила
Re[6]: без TdiBuildAccept ? Как?
От: Аноним  
Дата: 05.11.06 12:55
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Алогритм правильный, но реализация хромает .

Слава богу!!! А то я уже подумал может случилась какое то мировое бедствие. Вчера, сегодня — полный штиль! Умеют люди отдыхать, а мне вот еще 4 дня с 9 до 9!!! Жуть

TC>Первое, по поводу отладки — подобные вещи ( BSOD ) при отладке драйвера — рядовое явление, бессмысленно по каждому случаю задавать вопрос. Поставте точку остонова в начало ф.Tdi_ClientEventConnect и протрассируйте код. Узнав точное место ошибки, можно будет и документацию почитать или задать осмысленный вопрос.


Если честно пишу драйвер впервые, поэтому как поставить точки останова для драйвера я не знаю...Драйвер мне достался от предыдущего программиста, точнее его каркас — DriverEntry Драйвер грузится вместе с системой. Отладочную информацию смотрю через DbgView+TdiMon

TC>В данном случае, учитывая факт, что клиентсикие нотификаторы вызываются на DISPATCH_LEVEL, можно указать несколько мест, приводящих к фатальным ошибкам:

TC>- KeWaitForMutexObject — ожидание с ненулевым таймаутом не допустимо
TC>- TdiBuildInternalDeviceControlIr — документация настаивает на вызове только на PASSIVE_LEVEL ( хотя вроде как BSOD а быть не должно )
TC>- KeWaitForSingleObject — ожидание м ненулевым таймаутом не допустимо


Так я вылетая даже с пустым нотификатором...

Я сейчас все это дело немного переделал, но результат тотже:

NTSTATUS TdiFuncs_InitializeServer(PTDI_SESSION pContext)
{
    NTSTATUS NtStatus;

    PTDI_SESSION            pTdiSession    = (PTDI_SESSION)pContext;
    PTDI_HANDLE                pTdiHandle    = (PTDI_HANDLE)pTdiSession->pTdiHandle;
    PCOMM_DEVICE_EXTENSION    pDevExt        = (PCOMM_DEVICE_EXTENSION)pTdiSession->pCommExt;

    HANDLE hTransport, hConnection;
    PFILE_OBJECT  pfoTransport, pfoConnection;
    PDEVICE_OBJECT pTdiDevice;
    PIRP pIrp;
    IO_STATUS_BLOCK IoStatusBlock = {0};
    TDI_COMPLETION_CONTEXT TdiCompletionContext;

    NtStatus = TdiFuncs_OpenTransportAddress(&hTransport,
                                             &pfoTransport,
                                             0,//ntohl(pContext->m_address),
                                             ntohs(pDevExt->m_port));
    if(!NT_SUCCESS(NtStatus))
        goto errorOpenTransportAddress;


    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
                                            TDI_EVENT_RECEIVE,
                                            Tdi_ClientEventReceive,
                                            (PVOID)pTdiSession);

    if(!NT_SUCCESS(NtStatus))
        goto errorSetEventHandler;

    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
                                            TDI_EVENT_DISCONNECT,
                                            Tdi_ClientEventDisconnect,
                                            (PVOID)pTdiSession);

    if(!NT_SUCCESS(NtStatus))
        goto errorSetEventHandler;

    NtStatus = TdiFuncs_OpenConnection(&hConnection, &pfoConnection);

    if(!NT_SUCCESS(NtStatus))
        goto errorOpenConnection;

    NtStatus = TdiFuncs_AssociateTransportAndConnection(hTransport, pfoConnection);

    if(!NT_SUCCESS(NtStatus))
        goto errorAssociateTransportAndConnection;



    KeInitializeEvent(&TdiCompletionContext.kCompleteEvent, NotificationEvent, FALSE);

    pTdiDevice = IoGetRelatedDeviceObject(pfoConnection);

    pIrp =                                     
       TdiBuildInternalDeviceControlIrp(TDI_ACCEPT,
                                        pTdiDevice,    
                                        pfoConnection,
                                        &TdiCompletionContext.kCompleteEvent, 
                                        &IoStatusBlock               
                                       );
    if(!NT_SUCCESS(NtStatus))
    {
        goto errorAssociateTransportAndConnection;
    }

    pTdiSession->pIrpAccept = pIrp; 

/**/
    NtStatus = TdiFuncs_SetEventHandler(pfoTransport,
                                            TDI_EVENT_CONNECT,
                                            Tdi_ClientEventConnect,
                                            (PVOID)pTdiSession);

    if(!NT_SUCCESS(NtStatus))
    {
        goto errorAssociateTransportAndConnection;
    }

    if(NT_SUCCESS(NtStatus))
    {
        pTdiHandle->hConnection   = hConnection;
        pTdiHandle->hTransport    = hTransport;

        pTdiHandle->pfoConnection = pfoConnection;
        pTdiHandle->pfoTransport  = pfoTransport;
    }

//    KeWaitForSingleObject(&TdiCompletionContext.kCompleteEvent, Executive, KernelMode, FALSE, 0);

//     if (STATUS_SUCCESS!=IoStatusBlock.Status)
//       goto errorAssociateTransportAndConnection;

    return NtStatus;

//errorListen:

errorAssociateTransportAndConnection:
    TdiFuncs_CloseTdiOpenHandle(hConnection, pfoConnection);

errorOpenConnection:
    TdiFuncs_CloseTdiOpenHandle(hTransport, pfoTransport);

errorSetEventHandler:

errorOpenTransportAddress:
    

    return NtStatus;


}

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


    PTDI_SESSION            pTdiSession    = (PTDI_SESSION)pContext;
    PTDI_HANDLE                pTdiHandle    = (PTDI_HANDLE)pTdiSession->pTdiHandle;
    PCOMM_DEVICE_EXTENSION    pDevExt        = (PCOMM_DEVICE_EXTENSION)pTdiSession->pCommExt;


    pTdiSession->pIrpAccept = NULL;                          // Be neat (the Irp will be recycled by transport).

    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;
} 

NTSTATUS
Tdi_ClientEventConnect(
       IN PVOID TdiEventContext,
       IN LONG RemoteAddressLength,
       IN PVOID RemoteAddress,
       IN LONG UserDataLength,
       IN PVOID UserData,
       IN LONG OptionsLength,
       IN PVOID Options,
       OUT CONNECTION_CONTEXT *ConnectionContext,
       OUT PIRP *AcceptIrp
      )
{
    NTSTATUS NtStatus = STATUS_SUCCESS;
//    PIRP pIrp;

    PTDI_SESSION            pTdiSession    = (PTDI_SESSION)TdiEventContext;
    PTDI_HANDLE                pTdiHandle    = (PTDI_HANDLE)pTdiSession->pTdiHandle;
    PCOMM_DEVICE_EXTENSION    pDevExt        = (PCOMM_DEVICE_EXTENSION)pTdiSession->pCommExt;

//    PCOMM_DEVICE_EXTENSION pDevExt = (PCOMM_DEVICE_EXTENSION)TdiEventContext;
    PDEVICE_OBJECT pTdiDevice;
//    IO_STATUS_BLOCK IoStatusBlock;
//    TDI_COMPLETION_CONTEXT TdiCompletionContext;
    TDI_CONNECTION_INFORMATION  RequestConnectionInfo = {0};
    TDI_CONNECTION_INFORMATION  ReturnConnectionInfo  = {0};

    KeWaitForMutexObject(&pDevExt->kConnectionLock, Executive, KernelMode, FALSE, NULL);

    pTdiDevice = IoGetRelatedDeviceObject(pTdiHandle->pfoConnection);

    TdiBuildAccept(pTdiSession->pIrpAccept, 
                pTdiDevice,
                pTdiHandle->pfoConnection,
                TdiFunc_AcceptComplete,        
                pTdiSession,                       
                &RequestConnectionInfo,                        
                NULL
               );

    IoSetNextIrpStackLocation(pTdiSession->pIrpAccept);   

    *AcceptIrp = pTdiSession->pIrpAccept;  

    *ConnectionContext = (CONNECTION_CONTEXT)pTdiSession; 

    KeReleaseMutex(&pDevExt->kConnectionLock, FALSE);

    return( STATUS_MORE_PROCESSING_REQUIRED );
}


Ну вообщем извиняюсь за избыточное цитирование, но может комуто весь этот бред поможет , и человек поучится на моих ошибках
Re[7]: без TdiBuildAccept ? Как?
От: TarasCo  
Дата: 05.11.06 15:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если честно пишу драйвер впервые, поэтому как поставить точки останова для драйвера я не знаю...Драйвер мне достался от предыдущего программиста, точнее его каркас — DriverEntry Драйвер грузится вместе с системой. Отладочную информацию смотрю через DbgView+TdiMon


Этак Вы будете писать очень долго. Предлагаю отвлечся от текущей проблемы и организовать нормальный поцесс разработки — использовать отладчик.
Если у Вас есть два компьютера и возможность связать их через последовательный порт или через 1394, то лучшим вариантом будет использование windbg ( свободно распространяется ). Если машина одна — то SoftIce. Оба эти отладчика поддерживают трассировку по исходному коду. Кроме того, windbg полезен при разборе т.н crash dump ов. И еще один совет — не загружать драйвер вместе с системой — очень трудно разрабатывать. Поставте порядок загрузки 3, т.е по требованию. Загрузить драйвер можно будет с помощью команды net start имя_сервиса

А>Я сейчас все это дело немного переделал, но результат тотже:


Вы таки решили оставить захват мьютекса — KeWaitForMutexObject. Еще раз напишу — в данном случае НЕЛЬЗЯ использовать мьютексы. Потом появился у Вас в коде вызов IoSetNextIrpStackLocation, зачем?
Да пребудет с тобою сила
Re[8]: без TdiBuildAccept ? Как?
От: Аноним  
Дата: 06.11.06 03:39
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Этак Вы будете писать очень долго. Предлагаю отвлечся от текущей проблемы и организовать нормальный поцесс разработки — использовать отладчик.

Да это понятно...

TC>Если у Вас есть два компьютера и возможность связать их через последовательный порт или через 1394, то лучшим вариантом будет использование windbg ( свободно распространяется ).

Машины нет, но постараюсь че нибудь придумать...

TC>Если машина одна — то SoftIce.

Пробывал я как то что то он мне не очень понравился..

TC>Оба эти отладчика поддерживают трассировку по исходному коду. Кроме того, windbg полезен при разборе т.н crash dump ов.


TC>И еще один совет — не загружать драйвер вместе с системой — очень трудно разрабатывать. Поставте порядок загрузки 3, т.е по требованию. Загрузить драйвер можно будет с помощью команды net start имя_сервиса


Я в самом начале как то попытался он у меня не загружается...Он инсталится с помощью инф-файла,как виртуальный параллельный порт. Как мне такой драйвер можно загрузить после старта ОС? И выгрузить? Пытаюсь его в устройствах отключить — требует перезагрузки системы!
Re[9]: без TdiBuildAccept ? Как?
От: TarasCo  
Дата: 06.11.06 10:48
Оценка:
Здравствуйте, Аноним, Вы писали:

TC>>Если машина одна — то SoftIce.

А>Пробывал я как то что то он мне не очень понравился..

Ну, не знаю, если Вам кажется удобнее использовать DbgView.....

А>Я в самом начале как то попытался он у меня не загружается...Он инсталится с помощью инф-файла,как виртуальный параллельный порт. Как мне такой драйвер можно загрузить после старта ОС? И выгрузить? Пытаюсь его в устройствах отключить — требует перезагрузки системы!


Возможно, не задана стандартная процедура DriverUnload. Или c обработкой PnP сообщений ( если конечно драйвер класса параллельных портов должен их обрабатывать? ) что то не в порядке. Кроме того, у Вас проблемы с установленем ТСР соединения. Ну вынесите это в отдельный драйвер и отлаживайте, потом перенесите рабочий код в исходный проект.
Да пребудет с тобою сила
Re[10]: без TdiBuildAccept ? Как?
От: Аноним  
Дата: 06.11.06 13:30
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Здравствуйте, Аноним, Вы писали:


TC>>>Если машина одна — то SoftIce.

А>>Пробывал я как то что то он мне не очень понравился..

TC>Ну, не знаю, если Вам кажется удобнее использовать DbgView.....

Теперь то я ясно что не очень удобно!!!

А>>Я в самом начале как то попытался он у меня не загружается...Он инсталится с помощью инф-файла,как виртуальный параллельный порт. Как мне такой драйвер можно загрузить после старта ОС? И выгрузить? Пытаюсь его в устройствах отключить — требует перезагрузки системы!


TC>Возможно, не задана стандартная процедура DriverUnload. Или c обработкой PnP сообщений ( если конечно драйвер класса параллельных портов должен их обрабатывать? ) что то не в порядке.

Да вроде все ф-ции заDispatchены, вот на сколько они верны....мне не понятно. В DriverUnload просто убивается виртуальный порт,


TC>Кроме того, у Вас проблемы с установленем ТСР соединения. Ну вынесите это в отдельный драйвер и отлаживайте, потом перенесите рабочий код в исходный проект.


Вопрос, я понял Вас, но как мне загружать этот драйвер, с системой или по требованию? ОС во время загрузки не будет пытаться открыть этот вирт.порт? Веддь у меня в IRP_MJ_CREATE происходит запуск потока в котором создается TDI "сессия", а в IRP_MJ_CLEANUP он убивается. Т.е. если это так то девайс виртуального порта попытается подрубиться к моему вынесенному "сетевому" драйверу — а тут облом...Или я не прав?
Re[11]: Ну все-таки, почему BSOD?
От: Аноним  
Дата: 08.11.06 13:55
Оценка:
Не поиму в чем дело? Почему постоянно этот BSOD?

Я уже раз 5 переделал эту ф-цию конекта, результат один — крах ОС! Может есть какая то хитрость?

NTSTATUS
TdiFuncs_ServerConnectedCallback(
   IN PDEVICE_OBJECT pDeviceObject,
   IN PIRP pIrp,
   IN PVOID Context
   )
{
    PTDI_SESSION            pTdiSession    = (PTDI_SESSION)Context;
    PTDI_LOCALPOINT            pLocalPoint = (PTDI_LOCALPOINT)pTdiSession->pLocalPoint;
    PTDI_ENDPOINT            pEndPoint    = (PTDI_ENDPOINT)pTdiSession->pEndPoint;
    PTDI_HANDLE                pTransport    = (PTDI_HANDLE)pLocalPoint->pTransport;
    PTDI_HANDLE                pConnection    = (PTDI_HANDLE)pEndPoint->pConnection;
    ;

    IoFreeIrp( pIrp );

    return( STATUS_MORE_PROCESSING_REQUIRED );
}


NTSTATUS
Tdi_ServerEventConnect(
       IN PVOID TdiEventContext,
       IN LONG RemoteAddressLength,
       IN PVOID RemoteAddress,
       IN LONG UserDataLength,
       IN PVOID UserData,
       IN LONG OptionsLength,
       IN PVOID Options,
       OUT CONNECTION_CONTEXT *ConnectionContext,
       OUT PIRP *AcceptIrp
      )
{
    NTSTATUS NtStatus = STATUS_SUCCESS;

    PTDI_SESSION            pTdiSession    = (PTDI_SESSION)TdiEventContext;
    PTDI_LOCALPOINT            pLocalPoint = (PTDI_LOCALPOINT)pTdiSession->pLocalPoint;
    PTDI_ENDPOINT            pEndPoint    = (PTDI_ENDPOINT)pTdiSession->pEndPoint;
    PTDI_HANDLE                pTransport    = (PTDI_HANDLE)pLocalPoint->pTransport;
    PTDI_HANDLE                pConnection    = (PTDI_HANDLE)pEndPoint->pConnection;
    

    PDEVICE_OBJECT    pDeviceObject;

    pDeviceObject = IoGetRelatedDeviceObject(pConnection->pFileObject);

    NdisMoveMemory( &pEndPoint->m_RemoteAddress,
                    RemoteAddress,
                    sizeof( TA_IP_ADDRESS )
                    );

    pEndPoint->m_pAcceptIrp = IoAllocateIrp(
                                 pDeviceObject->StackSize,
                                 FALSE
                                 );

    if( !pEndPoint->m_pAcceptIrp )
      return( STATUS_INSUFFICIENT_RESOURCES );

    pEndPoint->m_RemoteConnectionInfo.UserDataLength = 0;
    pEndPoint->m_RemoteConnectionInfo.UserData = NULL;

    pEndPoint->m_RemoteConnectionInfo.OptionsLength = 0;
    pEndPoint->m_RemoteConnectionInfo.Options = NULL;

    pEndPoint->m_RemoteConnectionInfo.RemoteAddressLength = sizeof( TA_IP_ADDRESS );
    pEndPoint->m_RemoteConnectionInfo.RemoteAddress = &pEndPoint->m_RemoteAddress;

     TdiBuildAccept(
        pEndPoint->m_pAcceptIrp,          
        pDeviceObject,                  
        pConnection->pFileObject,   
        TdiFuncs_ServerConnectedCallback,
        pTdiSession,
        &pEndPoint->m_RemoteConnectionInfo,
        &pEndPoint->m_RemoteConnectionInfo
        );


    *AcceptIrp = pEndPoint->m_pAcceptIrp;
    *ConnectionContext = pTdiSession;

    return( STATUS_MORE_PROCESSING_REQUIRED );
}

................................................
NtStatus = TdiFuncs_SetEventHandler(pTransport->pFileObject,
                                            pLocalPoint,
                                            TDI_EVENT_CONNECT,
                                            Tdi_ServerEventConnect,
                                            (PVOID)pTdiSession);

..............................................
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.