Здравствуйте, 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;
}