亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? passthru.c

?? NDIS IM Driver passthruEx
?? C
字號:
//*************************************************************************************************************************
//=================文件名:   passthru.c
//=================作者: 謝明  xieming@centerm.com.cn
//*************************************************************************************************************************


#include "precomp.h"
#pragma hdrstop


#pragma NDIS_INIT_FUNCTION(DriverEntry)

NDIS_HANDLE         ProtHandle = NULL;
NDIS_HANDLE         DriverHandle = NULL;
NDIS_MEDIUM         MediumArray[4] =
                    {
                        NdisMedium802_3,    // Ethernet
                        NdisMedium802_5,    // Token-ring
                        NdisMediumFddi,     // Fddi
                        NdisMediumWan       // NDISWAN
                    };

NDIS_SPIN_LOCK     GlobalLock;

PADAPT             pAdaptList = NULL;
LONG               MiniportCount = 0;

NDIS_HANDLE        NdisWrapperHandle;

//
// To support ioctls from user-mode:
//

#define LINKNAME_STRING     L"\\DosDevices\\Passthru"
#define NTDEVICE_STRING     L"\\Device\\Passthru"

NDIS_HANDLE     NdisDeviceHandle = NULL;
PDEVICE_OBJECT  ControlDeviceObject = NULL;

enum _DEVICE_STATE
{
    PS_DEVICE_STATE_READY = 0,    // ready for create/delete
    PS_DEVICE_STATE_CREATING,    // create operation in progress
    PS_DEVICE_STATE_DELETING    // delete operation in progress
} ControlDeviceState = PS_DEVICE_STATE_READY;



NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT        DriverObject,
    IN PUNICODE_STRING       RegistryPath
    )
/*++

Routine Description:

    First entry point to be called, when this driver is loaded.
    Register with NDIS as an intermediate driver.

Arguments:

    DriverObject - pointer to the system's driver object structure
        for this driver
    
    RegistryPath - system's registry path for this driver
    
Return Value:

    STATUS_SUCCESS if all initialization is successful, STATUS_XXX
    error code if not.

--*/
{
    NDIS_STATUS                        Status;
    NDIS_PROTOCOL_CHARACTERISTICS      PChars;
    NDIS_MINIPORT_CHARACTERISTICS      MChars;
    NDIS_STRING                        Name;

    Status = NDIS_STATUS_SUCCESS;
    NdisAllocateSpinLock(&GlobalLock);

    NdisMInitializeWrapper(&NdisWrapperHandle, DriverObject, RegistryPath, NULL);

    do
    {
        //
        // Register the miniport with NDIS. Note that it is the miniport
        // which was started as a driver and not the protocol. Also the miniport
        // must be registered prior to the protocol since the protocol's BindAdapter
        // handler can be initiated anytime and when it is, it must be ready to
        // start driver instances.
        //

        NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_CHARACTERISTICS));

        MChars.MajorNdisVersion = PASSTHRU_MAJOR_NDIS_VERSION;
        MChars.MinorNdisVersion = PASSTHRU_MINOR_NDIS_VERSION;

        MChars.InitializeHandler = MPInitialize;
        MChars.QueryInformationHandler = MPQueryInformation;
        MChars.SetInformationHandler = MPSetInformation;
        MChars.ResetHandler = NULL;
        MChars.TransferDataHandler = MPTransferData;
        MChars.HaltHandler = MPHalt;
#ifdef NDIS51_MINIPORT
        MChars.CancelSendPacketsHandler = MPCancelSendPackets;
        MChars.PnPEventNotifyHandler = MPDevicePnPEvent;
        MChars.AdapterShutdownHandler = MPAdapterShutdown;
#endif // NDIS51_MINIPORT

        //
        // We will disable the check for hang timeout so we do not
        // need a check for hang handler!
        //
        MChars.CheckForHangHandler = NULL;
        MChars.ReturnPacketHandler = MPReturnPacket;

        //
        // Either the Send or the SendPackets handler should be specified.
        // If SendPackets handler is specified, SendHandler is ignored
        //
        MChars.SendHandler = NULL;    // MPSend;
        MChars.SendPacketsHandler = MPSendPackets;

        Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle,
                                                  &MChars,
                                                  sizeof(MChars),
                                                  &DriverHandle);
        if (Status != NDIS_STATUS_SUCCESS)
        {
            break;
        }

#ifndef WIN9X
        NdisMRegisterUnloadHandler(NdisWrapperHandle, PtUnload);
#endif

        //
        // Now register the protocol.
        //
        NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
        PChars.MajorNdisVersion = PASSTHRU_PROT_MAJOR_NDIS_VERSION;
        PChars.MinorNdisVersion = PASSTHRU_PROT_MINOR_NDIS_VERSION;

        //
        // Make sure the protocol-name matches the service-name
        // (from the INF) under which this protocol is installed.
        // This is needed to ensure that NDIS can correctly determine
        // the binding and call us to bind to miniports below.
        //
        NdisInitUnicodeString(&Name, L"Passthru");    // Protocol name
        PChars.Name = Name;
        PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete;
        PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete;
        PChars.SendCompleteHandler = PtSendComplete;
        PChars.TransferDataCompleteHandler = PtTransferDataComplete;
    
        PChars.ResetCompleteHandler = PtResetComplete;
        PChars.RequestCompleteHandler = PtRequestComplete;
        PChars.ReceiveHandler = PtReceive;
        PChars.ReceiveCompleteHandler = PtReceiveComplete;
        PChars.StatusHandler = PtStatus;
        PChars.StatusCompleteHandler = PtStatusComplete;
        PChars.BindAdapterHandler = PtBindAdapter;
        PChars.UnbindAdapterHandler = PtUnbindAdapter;
        PChars.UnloadHandler = PtUnloadProtocol;

        PChars.ReceivePacketHandler = PtReceivePacket;
        PChars.PnPEventHandler= PtPNPHandler;

        NdisRegisterProtocol(&Status,
                             &ProtHandle,
                             &PChars,
                             sizeof(NDIS_PROTOCOL_CHARACTERISTICS));

        if (Status != NDIS_STATUS_SUCCESS)
        {
            NdisIMDeregisterLayeredMiniport(DriverHandle);
            break;
        }

        NdisIMAssociateMiniport(DriverHandle, ProtHandle);
    }
    while (FALSE);

    if (Status != NDIS_STATUS_SUCCESS)
    {
        NdisTerminateWrapper(NdisWrapperHandle, NULL);
    }

    return(Status);
}


NDIS_STATUS
PtRegisterDevice(
    VOID
    )
/*++

Routine Description:

    Register an ioctl interface - a device object to be used for this
    purpose is created by NDIS when we call NdisMRegisterDevice.

    This routine is called whenever a new miniport instance is
    initialized. However, we only create one global device object,
    when the first miniport instance is initialized. This routine
    handles potential race conditions with PtDeregisterDevice via
    the ControlDeviceState and MiniportCount variables.

    NOTE: do not call this from DriverEntry; it will prevent the driver
    from being unloaded (e.g. on uninstall).

Arguments:

    None

Return Value:

    NDIS_STATUS_SUCCESS if we successfully register a device object.

--*/
{
    NDIS_STATUS            Status = NDIS_STATUS_SUCCESS;
    UNICODE_STRING         DeviceName;
    UNICODE_STRING         DeviceLinkUnicodeString;
    PDRIVER_DISPATCH       DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1];

    DBGPRINT(("==>PtRegisterDevice  Register our ioctl interface \n"));

    NdisAcquireSpinLock(&GlobalLock);

    ++MiniportCount;
    
    if (1 == MiniportCount)
    {
        ASSERT(ControlDeviceState != PS_DEVICE_STATE_CREATING);

        //
        // Another thread could be running PtDeregisterDevice on
        // behalf of another miniport instance. If so, wait for
        // it to exit.
        //
        while (ControlDeviceState != PS_DEVICE_STATE_READY)
        {
            NdisReleaseSpinLock(&GlobalLock);
            NdisMSleep(1);
            NdisAcquireSpinLock(&GlobalLock);
        }

        ControlDeviceState = PS_DEVICE_STATE_CREATING;

        NdisReleaseSpinLock(&GlobalLock);

    
        NdisZeroMemory(DispatchTable, (IRP_MJ_MAXIMUM_FUNCTION+1) * sizeof(PDRIVER_DISPATCH));

// BEGIN_PTUSERIO 我們自己的派遣例程
        DispatchTable[IRP_MJ_CREATE] = DevOpen;
		DispatchTable[IRP_MJ_CLEANUP] = DevCleanup;
        DispatchTable[IRP_MJ_CLOSE] = DevClose;
        DispatchTable[IRP_MJ_DEVICE_CONTROL] = DevIoControl;
// END_PTUSERIO
        

        NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING);
        NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING);

        //
        // Create a device object and register our dispatch handlers
        //
        
        Status = NdisMRegisterDevice(
                    NdisWrapperHandle, 
                    &DeviceName,
                    &DeviceLinkUnicodeString,
                    &DispatchTable[0],
                    &ControlDeviceObject,
                    &NdisDeviceHandle
                    );

        NdisAcquireSpinLock(&GlobalLock);

        ControlDeviceState = PS_DEVICE_STATE_READY;
    }

    NdisReleaseSpinLock(&GlobalLock);

    DBGPRINT(("<==PtRegisterDevice: %x\n", Status));

    return (Status);
}


// BEGIN_PTUSERIO

      // 在這里刪除了PtDispatch的實現

// END_PTUSERIO




NDIS_STATUS
PtDeregisterDevice(
    VOID
    )
/*++

Routine Description:

    Deregister the ioctl interface. This is called whenever a miniport
    instance is halted. When the last miniport instance is halted, we
    request NDIS to delete the device object

Arguments:

    NdisDeviceHandle - Handle returned by NdisMRegisterDevice

Return Value:

    NDIS_STATUS_SUCCESS if everything worked ok

--*/
{
    NDIS_STATUS Status = NDIS_STATUS_SUCCESS;

    DBGPRINT(("==>PassthruDeregisterDevice\n"));

    NdisAcquireSpinLock(&GlobalLock);

    ASSERT(MiniportCount > 0);

    --MiniportCount;
    
    if (0 == MiniportCount)
    {
        //
        // All miniport instances have been halted. Deregister
        // the control device.
        //

        ASSERT(ControlDeviceState == PS_DEVICE_STATE_READY);

        //
        // Block PtRegisterDevice() while we release the control
        // device lock and deregister the device.
        // 
        ControlDeviceState = PS_DEVICE_STATE_DELETING;

        NdisReleaseSpinLock(&GlobalLock);

        if (NdisDeviceHandle != NULL)
        {
            Status = NdisMDeregisterDevice(NdisDeviceHandle);
            NdisDeviceHandle = NULL;
        }

        NdisAcquireSpinLock(&GlobalLock);
        ControlDeviceState = PS_DEVICE_STATE_READY;
    }

    NdisReleaseSpinLock(&GlobalLock);

    DBGPRINT(("<== PassthruDeregisterDevice: %x\n", Status));
    return Status;
    
}

VOID
PtUnload(
    IN PDRIVER_OBJECT        DriverObject
    )
//
// PassThru driver unload function
//
{
    UNREFERENCED_PARAMETER(DriverObject);
    
    DBGPRINT(("PtUnload: entered\n"));
    PtUnloadProtocol();
    NdisIMDeregisterLayeredMiniport(DriverHandle);
    NdisFreeSpinLock(&GlobalLock);
    DBGPRINT(("PtUnload: done!\n"));
}











?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产三级电影在线观看| 在线中文字幕一区| 久久亚洲一区二区三区四区| 久久国产福利国产秒拍| 日韩美女一区二区三区四区| 激情另类小说区图片区视频区| 久久午夜羞羞影院免费观看| 成人一区在线看| 亚洲综合一二区| 欧美一区二区视频网站| 国产一区二区不卡老阿姨| 国产日本亚洲高清| 91高清视频在线| 青青草成人在线观看| 久久综合久久久久88| 国产aⅴ综合色| 一区二区三区中文免费| 日韩视频一区二区三区在线播放| 激情综合一区二区三区| 中文字幕一区二区三区蜜月| 欧美三级视频在线| 国产在线播放一区| 一区二区日韩电影| 欧美成人a∨高清免费观看| 99久久99精品久久久久久| 日韩成人一级大片| 国产精品青草综合久久久久99| 欧美亚洲自拍偷拍| 国产精品1区2区| 亚洲成a人片在线不卡一二三区| 久久亚洲精华国产精华液| 欧美在线视频你懂得| 国内精品国产三级国产a久久| 亚洲乱码中文字幕综合| 欧美成人一区二区三区在线观看| 成人午夜在线视频| 美腿丝袜亚洲一区| 亚洲黄色录像片| 国产三级一区二区三区| 欧美精品第1页| av午夜精品一区二区三区| 麻豆精品视频在线观看免费| 一二三四社区欧美黄| 国产亚洲精品免费| 欧美一区二区在线看| 欧洲人成人精品| 国产成+人+日韩+欧美+亚洲| 视频一区视频二区在线观看| 综合亚洲深深色噜噜狠狠网站| 中文字幕亚洲欧美在线不卡| 精品国产乱子伦一区| 欧美日韩aaa| 91久久香蕉国产日韩欧美9色| 国产一区二区在线免费观看| 日韩中文字幕亚洲一区二区va在线| 中文字幕一区二区三区四区| 久久久亚洲精品石原莉奈| 日韩视频免费直播| 欧美精品一级二级三级| 欧美综合天天夜夜久久| 91色在线porny| 成人黄色网址在线观看| 国产经典欧美精品| 激情深爱一区二区| 老司机精品视频线观看86| 偷拍自拍另类欧美| 亚洲成av人影院| 夜夜嗨av一区二区三区四季av| 亚洲天天做日日做天天谢日日欢 | 91视频国产观看| 粉嫩久久99精品久久久久久夜| 国产一区二区免费视频| 精品一区二区三区在线播放| 日韩av电影一区| 日韩精品成人一区二区在线| 日本强好片久久久久久aaa| 亚洲一卡二卡三卡四卡五卡| 夜夜揉揉日日人人青青一国产精品| 成人欧美一区二区三区黑人麻豆| 国产欧美日韩亚州综合| 国产欧美日韩精品一区| 欧美国产精品劲爆| 国产精品国产三级国产aⅴ入口 | 日本午夜一本久久久综合| 午夜久久久久久久久| 日本不卡的三区四区五区| 日本亚洲一区二区| 久久av资源站| 国产精品自拍毛片| 99久久久久免费精品国产| 一本到不卡免费一区二区| 在线视频你懂得一区二区三区| 色拍拍在线精品视频8848| 欧洲视频一区二区| 日韩一区二区三区电影 | 欧美日韩中字一区| 欧美一区二区在线免费观看| 欧美大尺度电影在线| 26uuu欧美日本| 国产精品久久久久天堂| 日韩高清一区二区| 日韩av一区二区在线影视| 色呦呦网站一区| 欧美午夜精品免费| 日韩一区二区精品| 欧美激情一区二区三区全黄| 亚洲激情网站免费观看| 日韩成人免费电影| 国产成人亚洲精品狼色在线| 色综合久久九月婷婷色综合| 在线综合视频播放| 国产精品丝袜久久久久久app| 一区二区免费在线播放| 久久激情综合网| 97se亚洲国产综合自在线不卡| 欧美日韩在线观看一区二区| 2024国产精品| 一个色在线综合| 国产一区二区三区免费在线观看| 一本到不卡免费一区二区| 欧美xxx久久| 亚洲精品国产a| 精品中文字幕一区二区| 97aⅴ精品视频一二三区| 日韩精品一区在线| 一区二区三区精品视频在线| 精品一区二区三区在线视频| 色哟哟国产精品| 26uuu色噜噜精品一区二区| 亚洲一区在线播放| 国产成人在线观看免费网站| 9191久久久久久久久久久| 国产精品丝袜91| 麻豆国产精品777777在线| 欧洲在线/亚洲| 亚洲国产精品av| 美女高潮久久久| 欧美图区在线视频| 中文字幕中文字幕一区| 久久精品国产免费看久久精品| 色诱视频网站一区| 国产欧美在线观看一区| 另类小说综合欧美亚洲| 欧美在线播放高清精品| 欧美国产精品专区| 精品一区二区三区免费播放| 欧美三级电影在线观看| 亚洲乱码国产乱码精品精小说 | 精品国产一区二区在线观看| 亚洲精品伦理在线| 成人h精品动漫一区二区三区| 欧美va亚洲va国产综合| 日韩国产高清影视| 欧美日韩午夜精品| 亚洲无人区一区| 色噜噜夜夜夜综合网| 国产精品国产三级国产三级人妇 | 国产不卡在线播放| 精品久久久久久久一区二区蜜臀| 丝袜脚交一区二区| 欧美日韩亚洲综合在线| 一区二区三区精密机械公司| 91麻豆蜜桃一区二区三区| 亚洲欧洲国产日韩| 99国产精品久久久久久久久久| 国产欧美日韩综合| www.激情成人| 国产精品国产a| 99久久777色| 一区二区免费看| 91福利精品第一导航| 亚洲午夜精品网| 欧美日韩亚洲不卡| 亚洲福利一二三区| 91精品国产欧美日韩| 免费欧美高清视频| 欧美成人福利视频| 国产麻豆精品theporn| 久久久99久久| 91社区在线播放| 亚洲妇熟xx妇色黄| 日韩免费电影一区| 国产专区欧美精品| 欧美国产乱子伦| 91成人看片片| 日本免费新一区视频| 欧美精品一区二区三区四区| 国产一区二区精品久久91| 国产精品无码永久免费888| 91小视频在线观看| 亚洲va欧美va国产va天堂影院| 欧美男人的天堂一二区| 久久精品国产亚洲aⅴ| 中文字幕第一区| 欧美色中文字幕| 精品一二线国产| 亚洲人成影院在线观看| 91麻豆精品国产91久久久资源速度 | 激情图片小说一区| 17c精品麻豆一区二区免费|