Re[2]: NDIS в VMWare
От: ScorpeeOn  
Дата: 08.01.08 14:46
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

SO>>Слышал, что для подобных драйверов VMWare не катит. Это так или все же ошибка где-то у меня?

AWW>Нет, это у вас.

Тогда не могли бы Вы посмотреть, что не так, если не сложно. Вот код.
Еще разок было так, что просто зависало все намертво.
По идее в OnReceiveStub должен приходить пакет (но не всегда полный, насколько я понял), но там в промежуток между стартом драйвера и бсодом ничего нету, хотя я пинговал свою машину.
Я где-то ошибся, но не могу найти где. Поглядите свежим взлядом плз

используйте тэг ccode для выделения С\С++ кода. И не квотьте приветствия — модератор

#include <ntddk.h>
#define NDIS51 1
#include <ndis.h>
#include <stdio.h>

struct UserStruct {
    ULONG ulData;
} g_UserStruct;

// Описатель открытого сетевого адаптера
NDIS_HANDLE g_AdapterHandle;

NDIS_HANDLE g_NdisProtocolHandle;
NDIS_EVENT  g_CloseWaitEvent;

VOID OnOpenAdapterDone(IN NDIS_HANDLE ProtocolBindingContext,
                       IN NDIS_STATUS Status,
                       IN NDIS_STATUS OpenErrorStatus) 
{

    NDIS_REQUEST ndisRequest;
    NDIS_STATUS ndisStatus;
    ULONG uiMode = NDIS_PACKET_TYPE_PROMISCUOUS;

    DbgPrint("In OnOpenAdapterDone");

    if( NT_SUCCESS(OpenErrorStatus) ) {

        ndisRequest.RequestType = NdisRequestSetInformation;
        ndisRequest.DATA.SET_INFORMATION.Oid = OID_GEN_CURRENT_PACKET_FILTER;
        ndisRequest.DATA.SET_INFORMATION.InformationBuffer = &uiMode;
        ndisRequest.DATA.SET_INFORMATION.InformationBufferLength = sizeof(ULONG);

        NdisRequest(&ndisStatus,
                    g_AdapterHandle,
                    &ndisRequest);

    } // if( NT_SUCCESS(OpenErrorStatus) )

}

VOID OnCloseAdapterDone(IN NDIS_HANDLE ProtocolBindingContext,
                        IN NDIS_STATUS Status) 
{

    DbgPrint("In OnCloseAdapterDone");
    NdisSetEvent(&g_CloseWaitEvent);

}

VOID OnSendDone(IN NDIS_HANDLE ProtocolBindingContext,
                IN PNDIS_PACKET pPacket,
                IN NDIS_STATUS Status) 
{

    DbgPrint("In OnSendDone");

}

VOID OnTransferDataDone(IN NDIS_HANDLE pBindingContext,
                        IN PNDIS_PACKET pPacket,
                        IN NDIS_STATUS Status,
                        IN UINT uiBytesTransfered) 
{

    DbgPrint("In OnTransferDataDone");

}

VOID OnResetDone(IN NDIS_HANDLE pBindingContext,
                 IN NDIS_STATUS Status) 
{

    DbgPrint("In OnResetDone");

}

VOID OnRequestDone(IN NDIS_HANDLE ProtocolBindingContext,
                   IN PNDIS_REQUEST pNdisRequest,
                   IN NDIS_STATUS Status) 
{

    DbgPrint("In OnRequestDone");

}

NDIS_STATUS OnReceiveStub(IN NDIS_HANDLE ProtocolBindingContext,
                          IN NDIS_HANDLE MacReceiveContext,
                          IN PVOID pvHeaderBuffer,
                          IN UINT uiHeaderBufferSize,
                          IN PVOID pvLookAheadBuffer,
                          IN UINT uiLookAheadBufferSize,
                          UINT uiPacketSize)
{

    char _t[255]={0};
    UINT uiFrameType = 0;

    memcpy(&uiFrameType, ( ((char*)pvHeaderBuffer) + 12 ), 2);
    _snprintf(_t, 253, "Type %u, PacketSize %u", uiFrameType, uiPacketSize);

    DbgPrint(_t);

    return NDIS_STATUS_NOT_ACCEPTED;

}

VOID OnReceiveDoneStub(IN NDIS_HANDLE ProtocolBindingContext) 
{

    DbgPrint("In OnReceiveDoneStub");

}

VOID OnStatus(IN NDIS_HANDLE ProtocolBindingContext,
              IN NDIS_STATUS Status,
              IN PVOID pvStatusBuffer,
              IN UINT uiStatusBufferSize) 
{

    DbgPrint("In OnStatus");

}

VOID OnStatusDone(IN NDIS_HANDLE ProtocolBindingContext) 
{

    DbgPrint("In OnStatusDone");

}

VOID OnBindAdapter(OUT PNDIS_STATUS pStatus,
                   IN NDIS_HANDLE BindContext,
                   IN PNDIS_STRING DeviceName,
                   IN PVOID pvSS1,
                   IN PVOID pvSS2) 
{

    DbgPrint("In OnBindAdapter");

}

VOID OnUnbindAdapter(OUT PNDIS_STATUS pStatus,
                   IN NDIS_HANDLE BindContext,
                   IN PNDIS_HANDLE UnbindContext) 
{

    DbgPrint("In OnUnbindAdapter");

}

VOID OnProtocolUnload(VOID) 
{

    DbgPrint("In OnProtocolUnload");

}

INT OnReceivePacket(IN NDIS_HANDLE ProtocolBindingContext,
                     IN PNDIS_PACKET pPacket) 
{

    DbgPrint("In OnReceivePacket");
    return 0;

}

NDIS_STATUS OnPNPEvent(IN NDIS_HANDLE ProtocolBindingContext,
                       IN PNET_PNP_EVENT pNetPnPEvent) 
{

    DbgPrint("In OnPNPEvent");
    return NDIS_STATUS_SUCCESS;

}



VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject) 
{

    NDIS_STATUS ndisStatus;

    NdisResetEvent(&g_CloseWaitEvent);
    
    NdisCloseAdapter(&ndisStatus,
                     g_AdapterHandle);

    if( ndisStatus == NDIS_STATUS_PENDING ) {
        NdisWaitEvent(&g_CloseWaitEvent, 0);
    }

    NdisDeregisterProtocol(&ndisStatus,
                           g_NdisProtocolHandle);

    if( !NT_SUCCESS(ndisStatus) ) {    
        DbgPrint("In DriverUnload: NdisDeregisterProtocol failed");
    }

    DbgPrint("In DriverUnload: NdisDeregisterProtocol success");

}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING ustrRegistryPath) 
{

    UINT uiMediumIndex = 0;
    NDIS_STATUS ndisStatus, ndisErrorStatus;
    NDIS_MEDIUM ndisMediumArray = NdisMedium802_3;
    UNICODE_STRING ustrAdapterName;
    NDIS_PROTOCOL_CHARACTERISTICS ndisProtocolCharacteristics;
    NDIS_STRING ndisProtoName = NDIS_STRING_CONST("PACKET_DRIVER");
    ULONG OsMajorVersion;
    ULONG OsMinorVersion;

    DbgPrint("In DriverEntry: Loading...");

    RtlInitUnicodeString(&ustrAdapterName, L"\\Device\\{79D2A5DE-2BA5-44A1-ADAF-69B90724722D}");
    NdisInitializeEvent(&g_CloseWaitEvent);

    pDriverObject->DriverUnload = DriverUnload;

    PsGetVersion(&OsMajorVersion, &OsMinorVersion, NULL, NULL);

    DbgPrint("In DriverEntry: OsMajorVersion = %lu, OsMinorVersion = %lu", OsMajorVersion, OsMinorVersion);

    RtlZeroMemory(&ndisProtocolCharacteristics, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

    ndisProtocolCharacteristics.MajorNdisVersion = 5;
    ndisProtocolCharacteristics.MinorNdisVersion = 1;
    ndisProtocolCharacteristics.Reserved = 0;
    ndisProtocolCharacteristics.OpenAdapterCompleteHandler = OnOpenAdapterDone;
    ndisProtocolCharacteristics.CloseAdapterCompleteHandler = OnCloseAdapterDone;
    ndisProtocolCharacteristics.SendCompleteHandler = OnSendDone;
    ndisProtocolCharacteristics.TransferDataCompleteHandler = OnTransferDataDone;
    ndisProtocolCharacteristics.ResetCompleteHandler = OnResetDone;
    ndisProtocolCharacteristics.RequestCompleteHandler = OnRequestDone;
    ndisProtocolCharacteristics.ReceiveHandler = OnReceiveStub;

    ndisProtocolCharacteristics.ReceiveCompleteHandler = OnReceiveDoneStub;
    ndisProtocolCharacteristics.StatusHandler = OnStatus;
    ndisProtocolCharacteristics.StatusCompleteHandler = OnStatusDone;
    ndisProtocolCharacteristics.Name = ndisProtoName;
    ndisProtocolCharacteristics.BindAdapterHandler = OnBindAdapter;
    ndisProtocolCharacteristics.UnbindAdapterHandler = OnUnbindAdapter;

    ndisProtocolCharacteristics.UnloadHandler = OnProtocolUnload;
    ndisProtocolCharacteristics.ReceivePacketHandler = OnReceivePacket;
    ndisProtocolCharacteristics.PnPEventHandler = OnPNPEvent;

    DbgPrint("In DriverEntry: Register NDIS Protocol");

    NdisRegisterProtocol(&ndisStatus,
                         &g_NdisProtocolHandle,
                         &ndisProtocolCharacteristics,
                         sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

    if( ndisStatus != NDIS_STATUS_SUCCESS ) {
        return ndisStatus;
    }

    DbgPrint("In DriverEntry: NdisRegisterProtocol success");

    NdisOpenAdapter(&ndisStatus,
                    &ndisErrorStatus,
                    &g_AdapterHandle,
                    &uiMediumIndex,
                    &ndisMediumArray,
                    1,
                    g_NdisProtocolHandle,
                    &g_UserStruct,
                    &ustrAdapterName,
                    0,
                    NULL);

    if( ndisStatus != NDIS_STATUS_PENDING ) {

        if( !NT_SUCCESS(ndisStatus) ) {

            if( ndisStatus == NDIS_STATUS_ADAPTER_NOT_FOUND ) {
                DbgPrint("In DriverEntry: Adapter not found");            
            }

            NdisDeregisterProtocol(&ndisStatus,
                                   g_NdisProtocolHandle);

            if( !NT_SUCCESS(ndisStatus) ) {
                DbgPrint("In DriverEntry: NdisDeregisterProtocol failed");            
            }

            return STATUS_UNSUCCESSFUL;
        
        } // if( !NT_SUCCESS(ndisStatus) )
        else {
        
            OnOpenAdapterDone(&g_UserStruct,
                              ndisStatus,
                              NDIS_STATUS_SUCCESS);

        }

        DbgPrint("In DriverEntry: NdisOpenAdapter success");
    
    
    } // if( ndisStatus != NDIS_STATUS_PENDING )

    return STATUS_SUCCESS;

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