da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync/* $Id$ */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync/** @file
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * VBoxNetAdp-win.cpp - NDIS6 Host-only Networking Driver, Windows-specific code.
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync/*
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * Copyright (C) 2014 Oracle Corporation
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync *
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * available from http://www.virtualbox.org. This file is free software;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * you can redistribute it and/or modify it under the terms of the GNU
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * General Public License (GPL) as published by the Free Software
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#define LOG_GROUP LOG_GROUP_NET_ADP_DRV
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#include <VBox/log.h>
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#include <VBox/version.h>
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#include <VBox/err.h>
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#include <iprt/initterm.h>
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#include <iprt/assert.h>
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncRT_C_DECLS_BEGIN
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#include <ndis.h>
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncRT_C_DECLS_END
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#include "VBoxNetAdp-win.h"
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#include "VBoxNetCmn-win.h"
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync/* Forward declarations */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_INITIALIZE vboxNetAdpWinInitializeEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_HALT vboxNetAdpWinHaltEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_UNLOAD vboxNetAdpWinUnload;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_PAUSE vboxNetAdpWinPause;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_RESTART vboxNetAdpWinRestart;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_OID_REQUEST vboxNetAdpWinOidRequest;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_SEND_NET_BUFFER_LISTS vboxNetAdpWinSendNetBufferLists;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_RETURN_NET_BUFFER_LISTS vboxNetAdpWinReturnNetBufferLists;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_CANCEL_SEND vboxNetAdpWinCancelSend;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_CHECK_FOR_HANG vboxNetAdpWinCheckForHangEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_RESET vboxNetAdpWinResetEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_DEVICE_PNP_EVENT_NOTIFY vboxNetAdpWinDevicePnPEventNotify;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_SHUTDOWN vboxNetAdpWinShutdownEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncMINIPORT_CANCEL_OID_REQUEST vboxNetAdpWinCancelOidRequest;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsynctypedef struct _VBOXNETADPGLOBALS
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync /** ndis device */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_HANDLE hDevice;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync /** device object */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PDEVICE_OBJECT pDevObj;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync /** our miniport driver handle */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_HANDLE hMiniportDriver;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync /** power management capabilities, shared by all instances, do not change after init */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_PNP_CAPABILITIES PMCaps;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync} VBOXNETADPGLOBALS, *PVBOXNETADPGLOBALS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync/* win-specific global data */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncVBOXNETADPGLOBALS g_VBoxNetAdpGlobals;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsynctypedef struct _VBOXNETADP_ADAPTER {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_HANDLE hAdapter;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADPGLOBALS pGlobals;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RTMAC MacAddr;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync} VBOXNETADP_ADAPTER;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsynctypedef VBOXNETADP_ADAPTER *PVBOXNETADP_ADAPTER;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncstatic NTSTATUS vboxNetAdpWinDevDispatch(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PIO_STACK_LOCATION pIrpSl = IoGetCurrentIrpStackLocation(pIrp);;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NTSTATUS Status = STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync switch (pIrpSl->MajorFunction)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case IRP_MJ_DEVICE_CONTROL:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = STATUS_NOT_SUPPORTED; // TODO: add/remove ioctls
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case IRP_MJ_CREATE:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case IRP_MJ_CLEANUP:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case IRP_MJ_CLOSE:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync default:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(0);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pIrp->IoStatus.Status = Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IoCompleteRequest(pIrp, IO_NO_INCREMENT);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncstatic NDIS_STATUS vboxNetAdpWinDevCreate(PVBOXNETADPGLOBALS pGlobals)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STRING DevName, LinkName;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PDRIVER_DISPATCH aMajorFunctions[IRP_MJ_MAXIMUM_FUNCTION+1];
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisInitUnicodeString(&DevName, VBOXNETADP_NAME_DEVICE);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisInitUnicodeString(&LinkName, VBOXNETADP_NAME_LINK);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(!pGlobals->hDevice);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(!pGlobals->pDevObj);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisZeroMemory(aMajorFunctions, sizeof (aMajorFunctions));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync aMajorFunctions[IRP_MJ_CREATE] = vboxNetAdpWinDevDispatch;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync aMajorFunctions[IRP_MJ_CLEANUP] = vboxNetAdpWinDevDispatch;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync aMajorFunctions[IRP_MJ_CLOSE] = vboxNetAdpWinDevDispatch;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync aMajorFunctions[IRP_MJ_DEVICE_CONTROL] = vboxNetAdpWinDevDispatch;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_DEVICE_OBJECT_ATTRIBUTES DeviceAttributes;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisZeroMemory(&DeviceAttributes, sizeof(DeviceAttributes));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync DeviceAttributes.Header.Type = NDIS_OBJECT_TYPE_DEVICE_OBJECT_ATTRIBUTES;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync DeviceAttributes.Header.Revision = NDIS_DEVICE_OBJECT_ATTRIBUTES_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync DeviceAttributes.Header.Size = sizeof(DeviceAttributes);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync DeviceAttributes.DeviceName = &DevName;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync DeviceAttributes.SymbolicName = &LinkName;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync DeviceAttributes.MajorFunctions = aMajorFunctions;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NdisRegisterDeviceEx(pGlobals->hMiniportDriver,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync &DeviceAttributes,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync &pGlobals->pDevObj,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync &pGlobals->hDevice);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log(("vboxNetAdpWinDevCreate: NdisRegisterDeviceEx returned 0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(Status == NDIS_STATUS_SUCCESS);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncstatic void vboxNetAdpWinDevDestroy(PVBOXNETADPGLOBALS pGlobals)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(pGlobals->hDevice);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(pGlobals->pDevObj);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisDeregisterDeviceEx(pGlobals->hDevice);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pGlobals->hDevice = NULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pGlobals->pDevObj = NULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncNDIS_OID g_SupportedOids[] =
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_CURRENT_LOOKAHEAD,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_CURRENT_PACKET_FILTER,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_INTERRUPT_MODERATION,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_LINK_PARAMETERS,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_MAXIMUM_TOTAL_SIZE,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_RCV_OK,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_RECEIVE_BLOCK_SIZE,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_RECEIVE_BUFFER_SPACE,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_STATISTICS,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_TRANSMIT_BLOCK_SIZE,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_TRANSMIT_BUFFER_SPACE,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_VENDOR_DESCRIPTION,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_VENDOR_DRIVER_VERSION,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_VENDOR_ID,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_GEN_XMIT_OK,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_802_3_PERMANENT_ADDRESS,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_802_3_CURRENT_ADDRESS,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_802_3_MULTICAST_LIST,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_802_3_MAXIMUM_LIST_SIZE,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_PNP_CAPABILITIES,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_PNP_QUERY_POWER,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OID_PNP_SET_POWER
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync};
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinAllocAdapter(NDIS_HANDLE hAdapter, PVBOXNETADP_ADAPTER *ppAdapter, ULONG64 NetLuid)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = NULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__": adapter handle=%p\n", hAdapter));
2b114c590cf5a19f8047cd7bde9c7e5ae00aa22bvboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync *ppAdapter = NULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter = (PVBOXNETADP_ADAPTER)NdisAllocateMemoryWithTagPriority(g_VBoxNetAdpGlobals.hMiniportDriver,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync sizeof(VBOXNETADP_ADAPTER),
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync VBOXNETADPWIN_TAG,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NormalPoolPriority);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (!pAdapter)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_RESOURCES;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": Out of memory while allocating adapter context (size=%d)\n", sizeof(VBOXNETADP_ADAPTER)));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync else
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisZeroMemory(pAdapter, sizeof(VBOXNETADP_ADAPTER));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter->hAdapter = hAdapter;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter->pGlobals = &g_VBoxNetAdpGlobals;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: Use netadp structure instead!
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync /* Use a locally administered version of the OUI we use for the guest NICs. */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter->MacAddr.au8[0] = 0x08 | 2;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter->MacAddr.au8[1] = 0x00;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter->MacAddr.au8[2] = 0x27;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter->MacAddr.au8[3] = (NetLuid >> 16) & 0xFF;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter->MacAddr.au8[4] = (NetLuid >> 8) & 0xFF;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pAdapter->MacAddr.au8[5] = NetLuid & 0xFF;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //TODO: Statistics?
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync *ppAdapter = pAdapter;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__": status=0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(void) vboxNetAdpWinFreeAdapter(PVBOXNETADP_ADAPTER pAdapter)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisFreeMemory(pAdapter, 0, 0);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLINLINE(NDIS_MEDIA_CONNECT_STATE) vboxNetAdpWinGetConnectState(PVBOXNETADP_ADAPTER pAdapter)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return MediaConnectStateConnected;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinInitializeEx(IN NDIS_HANDLE NdisMiniportHandle,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN NDIS_HANDLE MiniportDriverContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PNDIS_MINIPORT_INIT_PARAMETERS MiniportInitParameters)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = NULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__": miniport=0x%x\n", NdisMiniportHandle));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync do
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES RAttrs = {0};
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES GAttrs = {0};
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = vboxNetAdpWinAllocAdapter(NdisMiniportHandle, &pAdapter, MiniportInitParameters->NetLuid.Value);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (Status != NDIS_STATUS_SUCCESS)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": Failed to allocate the adapter context with 0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
2b114c590cf5a19f8047cd7bde9c7e5ae00aa22bvboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RAttrs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RAttrs.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RAttrs.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RAttrs.MiniportAdapterContext = pAdapter;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RAttrs.AttributeFlags = VBOXNETADPWIN_ATTR_FLAGS; // NDIS_MINIPORT_ATTRIBUTES_NDIS_WDM
4823fd55e2a1920524aa6b7cee0d352e8d5fd5edvboxsync RAttrs.CheckForHangTimeInSeconds = VBOXNETADPWIN_HANG_CHECK_TIME;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RAttrs.InterfaceType = NdisInterfaceInternal;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NdisMSetMiniportAttributes(NdisMiniportHandle,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&RAttrs);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (Status != NDIS_STATUS_SUCCESS)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": NdisMSetMiniportAttributes(registration) failed with 0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: Registry?
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: WDM stack?
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: DPC?
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MediaType = NdisMedium802_3;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.PhysicalMediumType = NdisPhysicalMediumUnspecified;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MtuSize = 1500; //TODO
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MaxXmitLinkSpeed = 1000000000ULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.XmitLinkSpeed = 1000000000ULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MaxRcvLinkSpeed = 1000000000ULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.RcvLinkSpeed = 1000000000ULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MediaConnectState = vboxNetAdpWinGetConnectState(pAdapter);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MediaDuplexState = MediaDuplexStateFull;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.LookaheadSize = 1500; //TODO
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MacOptions = VBOXNETADP_MAC_OPTIONS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.SupportedPacketFilters = VBOXNETADP_SUPPORTED_FILTERS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MaxMulticastListSize = 32; //TODO
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.MacAddressLength = ETH_LENGTH_OF_ADDRESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(GAttrs.MacAddressLength == sizeof(pAdapter->MacAddr));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync memcpy(GAttrs.PermanentMacAddress, pAdapter->MacAddr.au8, GAttrs.MacAddressLength);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync memcpy(GAttrs.CurrentMacAddress, pAdapter->MacAddr.au8, GAttrs.MacAddressLength);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.RecvScaleCapabilities = NULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.AccessType = NET_IF_ACCESS_BROADCAST;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.IfType = IF_TYPE_ETHERNET_CSMACD;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.IfConnectorPresent = false;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.SupportedStatistics = VBOXNETADPWIN_SUPPORTED_STATISTICS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.SupportedPauseFunctions = NdisPauseFunctionsUnsupported;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.DataBackFillSize = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.ContextBackFillSize = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.SupportedOidList = g_SupportedOids;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.SupportedOidListLength = sizeof(g_SupportedOids);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.AutoNegotiationFlags = NDIS_LINK_STATE_DUPLEX_AUTO_NEGOTIATED;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync GAttrs.PowerManagementCapabilities = &g_VBoxNetAdpGlobals.PMCaps;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NdisMSetMiniportAttributes(NdisMiniportHandle,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&GAttrs);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (Status != NDIS_STATUS_SUCCESS)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": NdisMSetMiniportAttributes(general) failed with 0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync } while (false);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (Status != NDIS_STATUS_SUCCESS)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (pAdapter)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync vboxNetAdpWinFreeAdapter(pAdapter);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__": status=0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(VOID) vboxNetAdpWinHaltEx(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN NDIS_HALT_ACTION HaltAction)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: Stop something?
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinPause(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PNDIS_MINIPORT_PAUSE_PARAMETERS MiniportPauseParameters)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__": status=0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinRestart(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PNDIS_MINIPORT_RESTART_PARAMETERS MiniportRestartParameters)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__": status=0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinOidRqQuery(PVBOXNETADP_ADAPTER pAdapter,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PNDIS_OID_REQUEST pRequest)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync struct _NDIS_OID_REQUEST::_REQUEST_DATA::_QUERY *pQuery = &pRequest->DATA.QUERY_INFORMATION;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync uint64_t u64Tmp = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync ULONG ulTmp = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVOID pInfo = &ulTmp;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync ULONG cbInfo = sizeof(ulTmp);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync switch (pQuery->Oid)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_INTERRUPT_MODERATION:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PNDIS_INTERRUPT_MODERATION_PARAMETERS pParams =
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync (PNDIS_INTERRUPT_MODERATION_PARAMETERS)pQuery->InformationBuffer;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync cbInfo = NDIS_SIZEOF_INTERRUPT_MODERATION_PARAMETERS_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (cbInfo > pQuery->InformationBufferLength)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
2b114c590cf5a19f8047cd7bde9c7e5ae00aa22bvboxsync pParams->Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pParams->Header.Revision = NDIS_INTERRUPT_MODERATION_PARAMETERS_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pParams->Header.Size = NDIS_SIZEOF_INTERRUPT_MODERATION_PARAMETERS_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pParams->Flags = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pParams->InterruptModeration = NdisInterruptModerationNotSupported;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pInfo = NULL; /* Do not copy */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_MAXIMUM_TOTAL_SIZE:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_RECEIVE_BLOCK_SIZE:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_TRANSMIT_BLOCK_SIZE:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync ulTmp = VBOXNETADP_MAX_FRAME_SIZE;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_RCV_OK:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_XMIT_OK:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync u64Tmp = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pInfo = &u64Tmp;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync cbInfo = sizeof(u64Tmp);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_RECEIVE_BUFFER_SPACE:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_TRANSMIT_BUFFER_SPACE:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: Make configurable
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync ulTmp = VBOXNETADP_MAX_FRAME_SIZE * 40;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_STATISTICS:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PNDIS_STATISTICS_INFO pStats =
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync (PNDIS_STATISTICS_INFO)pQuery->InformationBuffer;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync cbInfo = NDIS_SIZEOF_STATISTICS_INFO_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (cbInfo > pQuery->InformationBufferLength)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pInfo = NULL; /* Do not copy */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync memset(pStats, 0, cbInfo);
2b114c590cf5a19f8047cd7bde9c7e5ae00aa22bvboxsync pStats->Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pStats->Header.Revision = NDIS_STATISTICS_INFO_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pStats->Header.Size = NDIS_SIZEOF_STATISTICS_INFO_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: We need some stats, don't we?
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_VENDOR_DESCRIPTION:
4823fd55e2a1920524aa6b7cee0d352e8d5fd5edvboxsync pInfo = VBOXNETADP_VENDOR_NAME;
4823fd55e2a1920524aa6b7cee0d352e8d5fd5edvboxsync cbInfo = sizeof(VBOXNETADP_VENDOR_NAME);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_VENDOR_DRIVER_VERSION:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync ulTmp = (VBOXNETADP_VERSION_NDIS_MAJOR << 16) | VBOXNETADP_VERSION_NDIS_MINOR;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_VENDOR_ID:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync ulTmp = VBOXNETADP_VENDOR_ID;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_802_3_PERMANENT_ADDRESS:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_802_3_CURRENT_ADDRESS:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pInfo = &pAdapter->MacAddr;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync cbInfo = sizeof(pAdapter->MacAddr);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //case OID_802_3_MULTICAST_LIST:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_802_3_MAXIMUM_LIST_SIZE:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync ulTmp = VBOXNETADP_MCAST_LIST_SIZE;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_PNP_CAPABILITIES:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pInfo = &pAdapter->pGlobals->PMCaps;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync cbInfo = sizeof(pAdapter->pGlobals->PMCaps);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_PNP_QUERY_POWER:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pInfo = NULL; /* Do not copy */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync cbInfo = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync default:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_NOT_SUPPORTED;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (Status == NDIS_STATUS_SUCCESS)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (cbInfo > pQuery->InformationBufferLength)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pQuery->BytesNeeded = cbInfo;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_BUFFER_TOO_SHORT;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync else
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (pInfo)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisMoveMemory(pQuery->InformationBuffer, pInfo, cbInfo);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pQuery->BytesWritten = cbInfo;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__": status=0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinOidRqSet(PVBOXNETADP_ADAPTER pAdapter,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PNDIS_OID_REQUEST pRequest)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync struct _NDIS_OID_REQUEST::_REQUEST_DATA::_SET *pSet = &pRequest->DATA.SET_INFORMATION;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync switch (pSet->Oid)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_CURRENT_LOOKAHEAD:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (pSet->InformationBufferLength != sizeof(ULONG))
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pSet->BytesNeeded = sizeof(ULONG);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_INVALID_LENGTH;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: For the time being we simply ignore lookahead settings.
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pSet->BytesRead = sizeof(ULONG);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_CURRENT_PACKET_FILTER:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (pSet->InformationBufferLength != sizeof(ULONG))
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pSet->BytesNeeded = sizeof(ULONG);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_INVALID_LENGTH;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync // TODO: For the time being we simply ignore packet filter settings.
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pSet->BytesRead = pSet->InformationBufferLength;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_GEN_INTERRUPT_MODERATION:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pSet->BytesNeeded = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pSet->BytesRead = 0;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_INVALID_DATA;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case OID_PNP_SET_POWER:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (pSet->InformationBufferLength < sizeof(NDIS_DEVICE_POWER_STATE))
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_INVALID_LENGTH;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pSet->BytesRead = sizeof(NDIS_DEVICE_POWER_STATE);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
2b114c590cf5a19f8047cd7bde9c7e5ae00aa22bvboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync default:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_NOT_SUPPORTED;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__": status=0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinOidRequest(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PNDIS_OID_REQUEST NdisRequest)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync vboxNetCmnWinDumpOidRequest(__FUNCTION__, NdisRequest);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync switch (NdisRequest->RequestType)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#if 0
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case NdisRequestMethod:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = vboxNetAdpWinOidRqMethod(pAdapter, NdisRequest);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync#endif
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case NdisRequestSetInformation:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = vboxNetAdpWinOidRqSet(pAdapter, NdisRequest);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case NdisRequestQueryInformation:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync case NdisRequestQueryStatistics:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = vboxNetAdpWinOidRqQuery(pAdapter, NdisRequest);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync default:
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_NOT_SUPPORTED;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync break;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__": status=0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(VOID) vboxNetAdpWinSendNetBufferLists(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PNET_BUFFER_LIST NetBufferLists,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN NDIS_PORT_NUMBER PortNumber,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN ULONG SendFlags)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PNET_BUFFER_LIST pNbl = NetBufferLists;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync for (pNbl = NetBufferLists; pNbl; pNbl = NET_BUFFER_LIST_NEXT_NBL(pNbl))
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NET_BUFFER_LIST_STATUS(pNbl) = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisMSendNetBufferListsComplete(pAdapter->hAdapter, NetBufferLists,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync (SendFlags & NDIS_SEND_FLAGS_DISPATCH_LEVEL) ?
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL : 0);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(VOID) vboxNetAdpWinReturnNetBufferLists(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PNET_BUFFER_LIST NetBufferLists,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN ULONG ReturnFlags)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": We should not be here!\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(VOID) vboxNetAdpWinCancelSend(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PVOID CancelId)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": We should not be here!\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(BOOLEAN) vboxNetAdpWinCheckForHangEx(IN NDIS_HANDLE MiniportAdapterContext)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__" return false\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return FALSE;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinResetEx(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync OUT PBOOLEAN AddressingReset)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__": status=0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(VOID) vboxNetAdpWinDevicePnPEventNotify(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PNET_DEVICE_PNP_EVENT NetDevicePnPEvent)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": PnP event=%d\n", NetDevicePnPEvent->DevicePnPEvent));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(VOID) vboxNetAdpWinShutdownEx(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN NDIS_SHUTDOWN_ACTION ShutdownAction)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": action=%d\n", ShutdownAction));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(VOID) vboxNetAdpWinCancelOidRequest(IN NDIS_HANDLE MiniportAdapterContext,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync IN PVOID RequestId)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync PVBOXNETADP_ADAPTER pAdapter = (PVBOXNETADP_ADAPTER)MiniportAdapterContext;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log((__FUNCTION__": req id=%p\n", RequestId));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(VOID) vboxNetAdpWinUnload(IN PDRIVER_OBJECT DriverObject)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("==>"__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //vboxNetAdpWinDevDestroy(&g_VBoxNetAdpGlobals);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (g_VBoxNetAdpGlobals.hMiniportDriver)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisMDeregisterMiniportDriver(g_VBoxNetAdpGlobals.hMiniportDriver);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //NdisFreeSpinLock(&g_VBoxNetAdpGlobals.Lock);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync LogFlow(("<=="__FUNCTION__"\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RTR0Term();
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync/**
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync * register the miniport driver
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync */
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncDECLHIDDEN(NDIS_STATUS) vboxNetAdpWinRegister(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPathStr)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_MINIPORT_DRIVER_CHARACTERISTICS MChars;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisZeroMemory(&MChars, sizeof (MChars));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_DRIVER_CHARACTERISTICS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.Header.Size = sizeof(NDIS_MINIPORT_DRIVER_CHARACTERISTICS);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.Header.Revision = NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_1;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.MajorNdisVersion = VBOXNETADP_VERSION_NDIS_MAJOR;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.MinorNdisVersion = VBOXNETADP_VERSION_NDIS_MINOR;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.MajorDriverVersion = VBOXNETADP_VERSION_MAJOR;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.MinorDriverVersion = VBOXNETADP_VERSION_MINOR;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.InitializeHandlerEx = vboxNetAdpWinInitializeEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.HaltHandlerEx = vboxNetAdpWinHaltEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.UnloadHandler = vboxNetAdpWinUnload;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.PauseHandler = vboxNetAdpWinPause;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.RestartHandler = vboxNetAdpWinRestart;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.OidRequestHandler = vboxNetAdpWinOidRequest;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.SendNetBufferListsHandler = vboxNetAdpWinSendNetBufferLists;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.ReturnNetBufferListsHandler = vboxNetAdpWinReturnNetBufferLists;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.CancelSendHandler = vboxNetAdpWinCancelSend;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.CheckForHangHandlerEx = vboxNetAdpWinCheckForHangEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.ResetHandlerEx = vboxNetAdpWinResetEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.DevicePnPEventNotifyHandler = vboxNetAdpWinDevicePnPEventNotify;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.ShutdownHandlerEx = vboxNetAdpWinShutdownEx;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync MChars.CancelOidRequestHandler = vboxNetAdpWinCancelOidRequest;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync g_VBoxNetAdpGlobals.hMiniportDriver = NULL;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log(("vboxNetAdpWinRegister: registering miniport driver...\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NdisMRegisterMiniportDriver(pDriverObject,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync pRegistryPathStr,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync (NDIS_HANDLE)&g_VBoxNetAdpGlobals,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync &MChars,
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync &g_VBoxNetAdpGlobals.hMiniportDriver);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(Status == STATUS_SUCCESS);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (Status == STATUS_SUCCESS)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log(("vboxNetAdpWinRegister: successfully registered miniport driver; registering device...\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //Status = vboxNetAdpWinDevCreate(&g_VBoxNetAdpGlobals);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //Assert(Status == STATUS_SUCCESS);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //Log(("vboxNetAdpWinRegister: vboxNetAdpWinDevCreate() returned 0x%x\n", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync else
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log(("ERROR! vboxNetAdpWinRegister: failed to register miniport driver, status=0x%x", Status));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncRT_C_DECLS_BEGIN
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncNTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncRT_C_DECLS_END
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsyncNTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync{
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync int rc;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync rc = RTR0Init(0);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync AssertRC(rc);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (RT_SUCCESS(rc))
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync NdisZeroMemory(&g_VBoxNetAdpGlobals, sizeof (g_VBoxNetAdpGlobals));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //NdisAllocateSpinLock(&g_VBoxNetAdpGlobals.Lock);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //g_VBoxNetAdpGlobals.PMCaps.WakeUpCapabilities.Flags = NDIS_DEVICE_WAKE_UP_ENABLE;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync g_VBoxNetAdpGlobals.PMCaps.WakeUpCapabilities.MinMagicPacketWakeUp = NdisDeviceStateUnspecified;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync g_VBoxNetAdpGlobals.PMCaps.WakeUpCapabilities.MinPatternWakeUp = NdisDeviceStateUnspecified;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = vboxNetAdpWinRegister(pDriverObject, pRegistryPath);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Assert(Status == STATUS_SUCCESS);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync if (Status == NDIS_STATUS_SUCCESS)
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Log(("NETADP: started successfully\n"));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return STATUS_SUCCESS;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync //NdisFreeSpinLock(&g_VBoxNetAdpGlobals.Lock);
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RTLogDestroy(RTLogRelSetDefaultInstance(NULL));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RTLogDestroy(RTLogSetDefaultInstance(NULL));
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync RTR0Term();
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync else
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync {
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync Status = NDIS_STATUS_FAILURE;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync }
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync return Status;
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync}
da34f66f1d7f32c00dcccd9164bc10435de15952vboxsync