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

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

?? packet.c

?? <Visual C++ 網絡程序設計實例詳解>配套源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
                pRequest->Request.RequestType=NdisRequestSetInformation;
                pRequest->Request.DATA.SET_INFORMATION.Oid=OidData->Oid;

                pRequest->Request.DATA.SET_INFORMATION.InformationBuffer=
                                                                OidData->Data;
                pRequest->Request.DATA.SET_INFORMATION.InformationBufferLength=
                                                           OidData->Length;


            } else {


                pRequest->Request.RequestType=NdisRequestQueryInformation;
                pRequest->Request.DATA.QUERY_INFORMATION.Oid= OidData->Oid;

                pRequest->Request.DATA.QUERY_INFORMATION.InformationBuffer=
                                        OidData->Data;
                pRequest->Request.DATA.QUERY_INFORMATION.InformationBufferLength=
                                        OidData->Length;

            }

            //
            //  submit the request
            //
            NdisRequest(
                &status,
                open->AdapterHandle,
                &pRequest->Request
                );

        } else {
            //
            //  Buffer too small. The irp is completed by
            //  PacketRequestComplete routine.
            //
            status=NDIS_STATUS_FAILURE;
            pRequest->Request.DATA.SET_INFORMATION.BytesRead=0;
            pRequest->Request.DATA.QUERY_INFORMATION.BytesWritten=0;

        }

        if (status != NDIS_STATUS_PENDING) {

            DebugPrint(("Calling RequestCompleteHandler\n"));

            PacketRequestComplete(
                open,
                &pRequest->Request,
                status
                );
                
        }

    }
    
    return STATUS_PENDING;

}






VOID
PacketRequestComplete(
    IN NDIS_HANDLE   ProtocolBindingContext,
    IN PNDIS_REQUEST NdisRequest,
    IN NDIS_STATUS   Status
    )
/*++

Routine Description:

    This routine is called when a protocol-initiated query or set 
    operation, begun with a call to NdisRequest that returned 
    NDIS_STATUS_PENDING, is completed. 

Arguments:


Return Value:


--*/

{
    POPEN_INSTANCE      open;
    PIO_STACK_LOCATION  irpSp;
    PIRP                irp;
    PINTERNAL_REQUEST   pRequest;
    UINT                functionCode;

    PPACKET_OID_DATA    OidData;

    DebugPrint(("RequestComplete\n"));

    open = (POPEN_INSTANCE)ProtocolBindingContext;

    pRequest=CONTAINING_RECORD(NdisRequest,INTERNAL_REQUEST,Request);
    irp = pRequest->Irp;

    if(Status == NDIS_STATUS_SUCCESS)
    {
        irpSp = IoGetCurrentIrpStackLocation(irp);

        functionCode=irpSp->Parameters.DeviceIoControl.IoControlCode;

        OidData = irp->AssociatedIrp.SystemBuffer;

        if (functionCode == IOCTL_PROTOCOL_SET_OID) {

            OidData->Length=pRequest->Request.DATA.SET_INFORMATION.BytesRead;

        } else {

            if (functionCode == IOCTL_PROTOCOL_QUERY_OID) {

                OidData->Length=pRequest->Request.DATA.QUERY_INFORMATION.BytesWritten;

            }

        }

        irp->IoStatus.Status = STATUS_SUCCESS;
        irp->IoStatus.Information=irpSp->Parameters.DeviceIoControl.InputBufferLength;
    } else {
        irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        irp->IoStatus.Information = 0;
    }
    
    ExFreePool(pRequest);
    IoCompleteRequest(irp, IO_NO_INCREMENT);
    IoDecrement(open);

    return;
}



VOID
PacketStatus(
    IN NDIS_HANDLE   ProtocolBindingContext,
    IN NDIS_STATUS   Status,
    IN PVOID         StatusBuffer,
    IN UINT          StatusBufferSize
    )
/*++

Routine Description:

    This routine is called to handle status changes indicated 
    by the underlying NDIS driver. 

Arguments:


Return Value:


--*/

{

    DebugPrint(("Indication Status: %0x, StatusBufferSize: %d\n",
                            Status, StatusBufferSize));

    return;

}



VOID
PacketStatusComplete(
    IN NDIS_HANDLE  ProtocolBindingContext
    )
/*++

Routine Description:

    This routine is called by NDIS, along with PacketStatus, 
    to report the start and end of an NDIS- or NIC-driver-
    initiated status indicate operation. 

Arguments:


Return Value:


--*/
{

    DebugPrint(("StatusIndicationComplete\n"));

    return;

}

NTSTATUS
PacketGetAdapterList(
    IN  PVOID              Buffer,
    IN  ULONG              Length,
    IN  OUT PULONG         DataLength
    )

/*++

Routine Description:

    This routine walks the adapter list and gets the symbolic
    link and NIC description and fills it in the Buffer.
    The format of the information is given below.
    
Arguments:


Return Value:

--*/
{
    ULONG               requiredLength = 0, numOfAdapters = 0;
    KIRQL               oldIrql;
    PLIST_ENTRY         thisEntry, listHead;
    POPEN_INSTANCE      open;   

    DebugPrint(("Enter PacketGetAdapterList\n"));

    KeAcquireSpinLock(&Globals.GlobalLock, &oldIrql);

    //
    // Walks the list to find out total space required for AdapterName
    // and Symbolic Link.
    //
    listHead = &Globals.AdapterList;
    
    for(thisEntry = listHead->Flink; 
        thisEntry != listHead;
        thisEntry = thisEntry->Flink)
    {
        open = CONTAINING_RECORD(thisEntry, OPEN_INSTANCE, AdapterListEntry);
        
        requiredLength += open->AdapterName.Length + sizeof(UNICODE_NULL); 
        requiredLength += open->SymbolicLink.Length + sizeof(UNICODE_NULL); 
        numOfAdapters++; 
    }

    //
    // We will return the data in the following format: 
    // numOfAdapters + One_Or_More("AdapterName\0" + "SymbolicLink\0") + UNICODE_NULL
    // So let's include the numOfAdapters and UNICODE_NULL size
    // to the total length.
    //
    
    requiredLength += sizeof(ULONG) + sizeof(UNICODE_NULL);     

    *DataLength = requiredLength;
    
    if(requiredLength > Length) {
        KeReleaseSpinLock(&Globals.GlobalLock, oldIrql);
        return STATUS_BUFFER_TOO_SMALL;
    }

    *(PULONG)Buffer = numOfAdapters;
    (PCHAR)Buffer += sizeof(ULONG);
    
    //
    // Copy the name and symbolic link of each adapter.
    //
    
    for(thisEntry = listHead->Flink; 
        thisEntry != listHead;
        thisEntry = thisEntry->Flink)
    {
        open = CONTAINING_RECORD(thisEntry, OPEN_INSTANCE, AdapterListEntry);
        
        RtlCopyMemory(Buffer, open->AdapterName.Buffer,
                            open->AdapterName.Length+sizeof(WCHAR));

        (PCHAR)Buffer += open->AdapterName.Length+sizeof(WCHAR);
        
        RtlCopyMemory(Buffer, open->SymbolicLink.Buffer,
                            open->SymbolicLink.Length+sizeof(WCHAR));

        (PCHAR)Buffer += open->SymbolicLink.Length+sizeof(WCHAR);
                            
    }
    
    *(PWCHAR)Buffer = UNICODE_NULL;
    
    KeReleaseSpinLock(&Globals.GlobalLock, oldIrql);
    
    return STATUS_SUCCESS;

}

VOID
PacketBindAdapter(
    OUT PNDIS_STATUS            Status,
    IN  NDIS_HANDLE             BindContext,
    IN  PNDIS_STRING            DeviceName,
    IN  PVOID                   SystemSpecific1,
    IN  PVOID                   SystemSpecific2
    )
/*++

Routine Description:

    Called by NDIS to bind to a miniport below.

Arguments:

    Status             - Return status of bind here.
    BindContext        - Can be passed to NdisCompleteBindAdapter 
                         if this call is pended.
    DeviceName         - Device name to bind to. This is passed to 
                            NdisOpenAdapter.
    SystemSpecific1    - Can be passed to NdisOpenProtocolConfiguration to 
                            read per-binding information
    SystemSpecific2    - Unused for NDIS 4.0.


Return Value:

    NDIS_STATUS_PENDING    if this call is pended. In this case call 
                           NdisCompleteBindAdapter to complete.
    Anything else         Completes this call synchronously

--*/
{
    NDIS_STATUS         status;
    UINT                mediumIndex;
    USHORT              length;
    POPEN_INSTANCE      open = NULL;
    UNICODE_STRING      unicodeDeviceName;
    PDEVICE_OBJECT      deviceObject = NULL;
    PWSTR               symbolicLink = NULL, deviceNameStr = NULL;
    NDIS_MEDIUM         mediumArray=NdisMedium802_3;// This sample only 
                                                    //supports Ethernet medium.
    DebugPrint(("Binding DeviceName %ws\n", DeviceName->Buffer));

    do{

        //
        // Create a deviceobject for every adapter we bind to.
        // To make a name for the deviceObject, we will append Packet_ 
        // to the name portion of the input DeviceName.
        //

        unicodeDeviceName.Buffer = NULL;
        length = DeviceName->Length + 7 * sizeof(WCHAR) + sizeof(UNICODE_NULL);

        deviceNameStr = ExAllocatePool(NonPagedPool, length);
        if (!deviceNameStr) {

            DebugPrint(("Memory allocation for create symbolic failed\n"));
            *Status = NDIS_STATUS_FAILURE;
            break;
        }
        swprintf(deviceNameStr, L"\\Device\\Packet_%ws", &DeviceName->Buffer[8]);
        RtlInitUnicodeString(&unicodeDeviceName, deviceNameStr);
        
        DebugPrint(("Exported DeviceName %ws\n", unicodeDeviceName.Buffer));

        //
        // Create the deviceobject
        //
        status = IoCreateDevice(
                    Globals.DriverObject,
                    sizeof(OPEN_INSTANCE),
                    &unicodeDeviceName,
                    FILE_DEVICE_PROTOCOL,
                    0,
                    TRUE, // only one handle to the device at a time.
                    &deviceObject
                    );
       
        if (status != STATUS_SUCCESS) {

            DebugPrint(("CreateDevice Failed: %x\n", status));
            *Status = NDIS_STATUS_FAILURE;
            break;
        }
        
        deviceObject->Flags |= DO_DIRECT_IO;

        open  =  (POPEN_INSTANCE) deviceObject->DeviceExtension;
        open->DeviceObject = deviceObject;

        //
        // Create a symbolic link.
        // We need to replace Device from \Device\Packet_{GUID} with DosDevices
        // to create a symbolic link of the form \DosDevices\Packet_{GUID}
        // There is a four character difference between these two 
        // strings.
        //
        
        length = unicodeDeviceName.Length + sizeof(UNICODE_NULL) + 
                    (4 * sizeof(WCHAR));
        
        symbolicLink = ExAllocatePool(NonPagedPool, length);
        if (!symbolicLink) {

            DebugPrint(("Memory allocation for create symbolic failed\n"));
            *Status = NDIS_STATUS_FAILURE;
            break;
        }

        swprintf(symbolicLink, L"\\DosDevices\\%ws", 
                    &unicodeDeviceName.Buffer[8]);
        
        RtlInitUnicodeString(&open->SymbolicLink,symbolicLink);

        DebugPrint(("Symbolic Link: %ws\n", open->SymbolicLink.Buffer));        
        
        status = IoCreateSymbolicLink(
                (PUNICODE_STRING) &open->SymbolicLink,
                (PUNICODE_STRING) &unicodeDeviceName
                );
        if (status != STATUS_SUCCESS) {

            DebugPrint(("Create symbolic failed\n"));
            *Status = NDIS_STATUS_FAILURE;
            break;
        }
       
        ExFreePool(unicodeDeviceName.Buffer);
        unicodeDeviceName.Buffer = NULL;

        //
        //  Allocate a packet pool for our xmit and receive packets
        //

        NdisAllocatePacketPool(
            &status,
            &open->PacketPool,
            TRANSMIT_PACKETS,
            sizeof(PACKET_RESERVED));

        if (status != NDIS_STATUS_SUCCESS) {
            DebugPrint(("Packet: Failed to allocate packet pool\n"));
            break;
        }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃久久久久久久| 日韩精品成人一区二区在线| 精品一区精品二区高清| 91在线精品一区二区| wwwwww.欧美系列| 日韩精品五月天| 日本高清视频一区二区| 国产精品青草久久| 国产一区二区福利视频| 欧美日韩你懂的| 亚洲欧美日韩系列| 国产69精品一区二区亚洲孕妇| 欧美一区二区三区视频在线| 亚洲在线免费播放| 99综合电影在线视频| 久久亚洲二区三区| 免费看欧美美女黄的网站| 欧美无乱码久久久免费午夜一区 | 99国产精品一区| 久久夜色精品国产噜噜av | 国产精品国产自产拍高清av| 精品亚洲国产成人av制服丝袜 | 91国产精品成人| 一区精品在线播放| 波多野结衣视频一区| 久久精品人人爽人人爽| 久久99国产精品久久99果冻传媒| 欧美猛男超大videosgay| 亚洲第一久久影院| 欧美日韩成人综合| 婷婷久久综合九色综合伊人色| 欧美在线影院一区二区| 一区二区三区在线观看视频| 91小视频在线免费看| 综合网在线视频| 色诱视频网站一区| 亚洲在线视频免费观看| 欧美性感一区二区三区| 亚洲一本大道在线| 欧美精品tushy高清| 青娱乐精品在线视频| 欧美一区二区播放| 久久精品国产亚洲高清剧情介绍| 精品免费日韩av| 激情综合色播激情啊| 久久人人爽人人爽| 成人午夜又粗又硬又大| 国产精品久久久久久久久快鸭 | 色婷婷久久久久swag精品| 久久精品国产一区二区三| 精品88久久久久88久久久| 韩国精品免费视频| 中文字幕成人av| 91在线视频观看| 亚洲一二三四久久| 91精品国产aⅴ一区二区| 黄色日韩三级电影| 日本一区二区免费在线| 99久久精品一区二区| 亚洲已满18点击进入久久| 欧美日韩在线综合| 久久99精品久久久久久久久久久久| 久久精品视频免费| 日本精品一区二区三区高清| 石原莉奈在线亚洲三区| 精品国产区一区| 97超碰欧美中文字幕| 丝袜美腿亚洲一区二区图片| 精品国产一区二区亚洲人成毛片| 国产91对白在线观看九色| 一区二区三区欧美日| 日韩亚洲电影在线| 成人h动漫精品| 无吗不卡中文字幕| 国产视频亚洲色图| 欧美在线观看视频一区二区三区| 免费的成人av| **性色生活片久久毛片| 欧美男生操女生| 国产成人精品亚洲777人妖 | 久久综合给合久久狠狠狠97色69| 岛国精品在线播放| 亚洲成人av中文| 2020国产精品久久精品美国| 成人福利视频在线看| 亚洲成人777| 久久综合av免费| 色综合欧美在线视频区| 奇米影视在线99精品| 136国产福利精品导航| 日韩三级免费观看| 91免费版pro下载短视频| 免费美女久久99| 亚洲免费成人av| 久久色.com| 欧美日韩亚洲综合一区| 成人一区二区三区视频| 日韩av电影免费观看高清完整版 | 这里只有精品99re| 成人免费电影视频| 日韩影视精彩在线| 亚洲乱码国产乱码精品精小说| 日韩一区二区电影网| 一本到三区不卡视频| 国产又粗又猛又爽又黄91精品| 一区二区三区四区五区视频在线观看| 精品美女被调教视频大全网站| 色婷婷激情久久| 懂色一区二区三区免费观看| 亚洲动漫第一页| 国产精品天美传媒沈樵| 777亚洲妇女| 91捆绑美女网站| 国产精品一区在线| 美女www一区二区| 亚洲综合在线五月| 中文字幕中文乱码欧美一区二区| 欧美精品一区在线观看| 欧美日韩不卡一区| 色哟哟国产精品| 国产suv精品一区二区三区 | 中文字幕亚洲一区二区av在线| 精品久久久久av影院| 日本韩国精品在线| 成人国产亚洲欧美成人综合网| 狠狠色狠狠色综合| 蜜臀精品久久久久久蜜臀 | 中文字幕一区二区不卡| 久久先锋影音av| 欧美一区二区三区视频| 欧美日精品一区视频| 91麻豆123| 91蜜桃免费观看视频| 成人深夜在线观看| 黄一区二区三区| 久久激五月天综合精品| 日本系列欧美系列| 图片区小说区国产精品视频| 亚洲国产视频网站| 亚洲在线免费播放| 亚洲宅男天堂在线观看无病毒| 亚洲色图在线播放| 国产精品不卡在线| 成人免费在线视频| 中文字幕在线观看不卡| 欧美精彩视频一区二区三区| 久久久噜噜噜久久中文字幕色伊伊| 精品日韩在线观看| 日韩免费一区二区三区在线播放| 日韩三区在线观看| 欧美一区日本一区韩国一区| 6080国产精品一区二区| 欧美电影一区二区三区| 欧美日韩电影在线| 欧美一区二区三区播放老司机| 9191成人精品久久| 欧美一区永久视频免费观看| 91精品国产福利在线观看| 日韩视频国产视频| 欧美精品一区二区三区久久久| 亚洲精品一区二区三区影院 | 91精品国产综合久久国产大片| 色综合久久久久久久久久久| 99久久综合狠狠综合久久| 丁香婷婷综合五月| 99视频一区二区| 在线观看欧美日本| 欧美精品成人一区二区三区四区| 欧美一二三区在线| 久久综合色8888| 国产精品视频你懂的| 亚洲天堂成人在线观看| 亚洲乱码国产乱码精品精可以看 | 一区二区高清在线| 午夜电影一区二区三区| 日产精品久久久久久久性色| 激情综合五月婷婷| 顶级嫩模精品视频在线看| 一本色道亚洲精品aⅴ| 欧美日韩黄色一区二区| 91精品视频网| 精品成人在线观看| 国产精品久久久久久亚洲伦| 一区二区成人在线| 日本伊人午夜精品| 懂色av一区二区三区蜜臀| 日本久久一区二区三区| 欧美一卡二卡在线| 国产欧美精品一区二区三区四区 | 亚洲欧美福利一区二区| 亚洲成av人片观看| 国内精品第一页| 99久久精品一区二区| 在线播放91灌醉迷j高跟美女| 欧美不卡一二三| 成人免费视频在线观看| 日韩精品一二三四| 成人精品国产免费网站| 欧美久久久久久久久中文字幕| 久久久久国产一区二区三区四区 |