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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? passthru.c

?? NDIS Intermediate Driver
?? C
字號:
/*++

Copyright (c) 1992-2000  Microsoft Corporation
 
Module Name:
 
    passthru.c

Abstract:

    Ndis Intermediate Miniport driver sample. This is a passthru driver.

Author:

Environment:


Revision History:


--*/


#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\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));

        DispatchTable[IRP_MJ_CREATE] = PtDispatch;
        DispatchTable[IRP_MJ_CLEANUP] = PtDispatch;
        DispatchTable[IRP_MJ_CLOSE] = PtDispatch;
        DispatchTable[IRP_MJ_DEVICE_CONTROL] = PtDispatch;
        

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


NTSTATUS
PtDispatch(
    IN PDEVICE_OBJECT    DeviceObject,
    IN PIRP              Irp
    )
/*++
Routine Description:

    Process IRPs sent to this device.

Arguments:

    DeviceObject - pointer to a device object
    Irp      - pointer to an I/O Request Packet

Return Value:

    NTSTATUS - STATUS_SUCCESS always - change this when adding
    real code to handle ioctls.

--*/
{
    PIO_STACK_LOCATION  irpStack;
    NTSTATUS            status = STATUS_SUCCESS;

    UNREFERENCED_PARAMETER(DeviceObject);
    
    DBGPRINT(("==>Pt Dispatch\n"));
    irpStack = IoGetCurrentIrpStackLocation(Irp);
      

    switch (irpStack->MajorFunction)
    {
        case IRP_MJ_CREATE:
            break;
            
        case IRP_MJ_CLEANUP:
            break;
            
        case IRP_MJ_CLOSE:
            break;        
            
        case IRP_MJ_DEVICE_CONTROL:
            //
            // Add code here to handle ioctl commands sent to passthru.
            //
            break;        
        default:
            break;
    }

    Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    DBGPRINT(("<== Pt Dispatch\n"));

    return status;

} 


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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
白白色 亚洲乱淫| 精品夜夜嗨av一区二区三区| 久久99久久久久久久久久久| 91婷婷韩国欧美一区二区| 日韩免费高清视频| 亚洲精品国产一区二区三区四区在线| 久久精品国产色蜜蜜麻豆| 在线观看日韩一区| 国产精品久久久久影院老司| 另类调教123区| 在线成人小视频| 亚洲色欲色欲www| 国产成人综合在线观看| 日韩欧美中文字幕公布| 亚洲国产美国国产综合一区二区| 成人久久18免费网站麻豆| 欧美α欧美αv大片| 亚洲18色成人| 在线亚洲高清视频| 国产精品久久久一本精品| 国产成人综合网| 精品区一区二区| 蜜桃一区二区三区在线| 9191国产精品| 午夜精品久久久久久久久久 | 亚洲人成7777| 国产精品亚洲人在线观看| 精品少妇一区二区三区免费观看 | 成人欧美一区二区三区黑人麻豆 | 成人福利在线看| 久久夜色精品国产欧美乱极品| 日韩和欧美一区二区三区| 欧美性猛交xxxxxx富婆| 亚洲美女电影在线| 色呦呦国产精品| 成人欧美一区二区三区在线播放| 成人自拍视频在线观看| 国产欧美日韩三级| 国产成人综合亚洲网站| 久久久精品国产99久久精品芒果| 国产在线精品一区二区夜色| 日韩欧美亚洲一区二区| 美女性感视频久久| 精品国产乱码久久久久久老虎 | 亚洲欧洲在线观看av| 成人午夜伦理影院| 中文字幕欧美三区| 99久久伊人精品| 伊人色综合久久天天人手人婷| 色欧美片视频在线观看 | 国产欧美一二三区| 成人激情校园春色| 国产免费成人在线视频| av综合在线播放| 亚洲精品高清在线| 精品视频在线视频| 天天综合色天天综合| 日韩一区二区免费在线观看| 韩国精品在线观看| 亚洲国产精品t66y| 色综合天天性综合| 无吗不卡中文字幕| 日韩欧美国产系列| 国产福利不卡视频| 亚洲三级电影网站| 欧美日韩免费高清一区色橹橹 | 日韩成人免费看| 日韩欧美在线综合网| 国内成人精品2018免费看| 国产日韩一级二级三级| 成人性色生活片| 一级精品视频在线观看宜春院| 欧美日韩久久久久久| 久久国产精品色| 中文字幕制服丝袜一区二区三区| 日本精品裸体写真集在线观看| 天堂一区二区在线| 2023国产精华国产精品| 99久久99久久免费精品蜜臀| 亚洲永久免费av| 欧美成人性福生活免费看| 成人自拍视频在线| 午夜精品久久久久久久久| 久久精品视频在线免费观看| 91性感美女视频| 蜜臀91精品一区二区三区| 中文字幕成人在线观看| 欧美无砖砖区免费| 国产自产2019最新不卡| 日韩理论片中文av| 欧美一区二区在线播放| 成人午夜视频在线观看| 午夜精品一区二区三区电影天堂 | 亚洲在线视频一区| 久久理论电影网| 色婷婷综合中文久久一本| 日本成人在线网站| 亚洲欧美中日韩| 精品久久久久久久久久久院品网 | 人人精品人人爱| 国产精品久久久久久久久免费相片 | 成人av先锋影音| 日产欧产美韩系列久久99| 日本一区二区免费在线| 欧美日韩国产系列| 成人黄色小视频| 免费一级欧美片在线观看| 亚洲三级在线看| 久久综合九色欧美综合狠狠| 欧美亚洲日本一区| 丁香一区二区三区| 日韩激情在线观看| 一区二区三区在线免费视频| 久久天天做天天爱综合色| 欧美日韩一区二区三区高清| 福利一区二区在线观看| 免费成人av资源网| 亚洲图片有声小说| 中文字幕高清一区| 精品久久久久av影院| 欧美午夜不卡在线观看免费| 成人激情黄色小说| 精品在线视频一区| 视频精品一区二区| 亚洲伦理在线免费看| 中文字幕免费一区| 精品国产乱码久久久久久闺蜜| 欧美精品日韩一区| 一本久久综合亚洲鲁鲁五月天| 国产精品一二三在| 久久精品国产77777蜜臀| 亚洲风情在线资源站| 亚洲靠逼com| 亚洲欧洲韩国日本视频| 国产午夜久久久久| 久久综合久久99| 精品三级在线看| 欧美一激情一区二区三区| 欧洲精品一区二区三区在线观看| 成人av电影在线| 国产成人免费高清| 激情综合五月婷婷| 另类小说一区二区三区| 青青草国产精品97视觉盛宴| 日韩综合在线视频| 婷婷夜色潮精品综合在线| 亚洲一区影音先锋| 亚洲国产视频网站| 亚洲永久免费视频| 亚洲国产精品久久艾草纯爱| 亚洲乱码国产乱码精品精可以看| 日韩毛片一二三区| 亚洲精品老司机| 一区二区在线观看视频| 亚洲精品ww久久久久久p站| 中文字幕一区在线| 亚洲欧美综合另类在线卡通| 亚洲视频中文字幕| 亚洲欧美另类图片小说| 亚洲欧洲精品一区二区三区 | 国产精品天天看| 国产精品久久久一本精品| 国产精品免费视频一区| 国产精品二区一区二区aⅴ污介绍| 国产精品无人区| 综合在线观看色| 伊人色综合久久天天人手人婷| 亚洲一区在线观看视频| 视频在线观看一区| 六月丁香综合在线视频| 国产美女在线观看一区| 成人精品视频一区| 99在线热播精品免费| 91久久人澡人人添人人爽欧美| 欧美性色黄大片| 欧美一二三区在线观看| 久久久久久久免费视频了| 日本一区二区三级电影在线观看 | 日韩精品中文字幕一区二区三区 | 久久久久99精品国产片| 国产精品久久精品日日| 一区二区三区四区在线免费观看| 亚洲午夜一区二区| 秋霞午夜av一区二区三区| 久久精品久久综合| 成人黄色软件下载| 欧美在线免费播放| 日韩一级成人av| 欧美激情一区二区三区蜜桃视频| 亚洲欧洲日产国产综合网| 亚洲成人免费电影| 久久99久久99| 99久久精品免费精品国产| 欧美日韩一区二区在线观看视频 | 777奇米四色成人影色区| 亚洲精品一线二线三线| 国产精品久久久久久久久动漫| 亚洲综合在线观看视频| 免费久久99精品国产| 成人国产一区二区三区精品|