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

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

?? pnp.c

?? win2k kernel 的并口驅動程序模板
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*++

Copyright (C) Microsoft Corporation, 1998 - 1999

Module Name:

    parport.sys

File Name:

    pnp.c

Abstract:

    This file contains the parport AddDevice routine and
      functions for handling PnP IRPs.

    Exports:

     - PptPnpAddDevice() - PnP AddDevice routine

     - PptDispatchPnp()  - PnP Dispatch routine

     - PptPnpInitDispatchFunctionTable() - Initialize PptPnpDispatchFunctionTable[]

--*/

#include "pch.h"
#include "pnp.h"

PDEVICE_RELATIONS
PptPnpBuildRemovalRelations( 
    IN PDEVICE_EXTENSION Extension 
    )
{
    PDEVICE_RELATIONS             relations      = NULL;
    PLIST_ENTRY                   listHead       = &Extension->RemovalRelationsList;
    PLIST_ENTRY                   thisListEntry  = NULL;
    PLIST_ENTRY                   firstListEntry = NULL;
    BOOLEAN                       done           = FALSE;
    PREMOVAL_RELATIONS_LIST_ENTRY node           = NULL;
    ULONG                         count;
    ULONG                         i;
    PDEVICE_OBJECT                pDevObj;

    PptDump2(PARPNP1, ("ioctl::PptPnpBuildRemovalRelations - Enter\n"));

    // lock list
    ExAcquireFastMutex( &Extension->ExtensionFastMutex );
    
    if( IsListEmpty( listHead ) ) {
        PptDump2(PARPNP1, ("ioctl::PptPnpBuildRemovalRelationsList - Empty List\n"));
        goto targetExit;
    }

    // get count
    count = 0;
    
    while( !done ) {

        thisListEntry = RemoveHeadList( listHead );
        node = CONTAINING_RECORD( thisListEntry, REMOVAL_RELATIONS_LIST_ENTRY, ListEntry );

        if( firstListEntry == thisListEntry ) {
            // done - we've already seen this one - push back onto front of list 
            InsertHeadList( listHead, &node->ListEntry );            
            done = TRUE;
            PptDump2(PARPNP1, ("ioctl::PptPnpBuildRemovalRelationsList - Done\n"));
        } else {
            // dump node info
            PptDump2(PARPNP1, ("ioctl::PptPnpBuildRemovalRelationsList - entry= %x %wZ\n", node->DeviceObject, &node->DeviceName));
            InsertTailList( listHead, &node->ListEntry );
            ++count;
        }

        if( !firstListEntry ) {
            // save first element - use for loop termination
            PptDump2(PARPNP1, ("ioctl::PptPnpBuildRemovalRelationsList - saving first\n"));
            firstListEntry = thisListEntry;
        }
    }
    PptDump2(PARPNP1, ("ioctl::PptPnpBuildRemovalRelationsList - count= %d\n", count));

    // allocate DEVICE_RELATIONS
    relations = ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS) + (count-1) * sizeof(PDEVICE_OBJECT));
    if( !relations ) {
        PptDump2(PARPNP1, ("ioctl::PptPnpBuildRemovalRelationsList - unable to alloc pool to hold relations\n"));        
        goto targetExit;
    }
    
    // populate DEVICE_RELATIONS
    relations->Count = count;
    for( i=0 ; i < count ; ++i ) {
        thisListEntry = RemoveHeadList( listHead );
        node = CONTAINING_RECORD( thisListEntry, REMOVAL_RELATIONS_LIST_ENTRY, ListEntry );
        PptDump2(PARPNP1, ("ioctl::PptPnpBuildRemovalRelationsList - adding device= %x %wZ\n",
                           node->DeviceObject, &node->DeviceName));
        pDevObj = node->DeviceObject;
        ObReferenceObject( pDevObj );
        relations->Objects[i] = pDevObj;
        InsertTailList( listHead, &node->ListEntry );            
    }

targetExit:

    // unlock list
    ExReleaseFastMutex( &Extension->ExtensionFastMutex );    

    return relations;
}

NTSTATUS
PptPnpStartScanPciCardCmResourceList(
    IN  PDEVICE_EXTENSION Extension,
    IN  PIRP              Irp, 
    OUT PBOOLEAN          FoundPort,
    OUT PBOOLEAN          FoundIrq,
    OUT PBOOLEAN          FoundDma
    )
/*++dvdf3

Routine Description:

    This routine is used to parse the resource list for what we
      believe are PCI parallel port cards.

    This function scans the CM_RESOURCE_LIST supplied with the Pnp 
      IRP_MN_START_DEVICE IRP, extracts the resources from the list, 
      and saves them in the device extension.

Arguments:

    Extension    - The device extension of the target of the START IRP
    Irp          - The IRP
    FoundPort    - Did we find a  Port resource?
    FoundIrq     - Did we find an IRQ  resource?
    FoundDma     - Did we find a  DMA  resource?

Return Value:

    STATUS_SUCCESS                - if we were given a resource list,
    STATUS_INSUFFICIENT_RESOURCES - otherwise

--*/
{
    NTSTATUS                        status   = STATUS_SUCCESS;
    PIO_STACK_LOCATION              irpStack = IoGetCurrentIrpStackLocation( Irp );
    PCM_RESOURCE_LIST               ResourceList;
    PCM_FULL_RESOURCE_DESCRIPTOR    FullResourceDescriptor;
    PCM_PARTIAL_RESOURCE_LIST       PartialResourceList;
    PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResourceDescriptor;
    ULONG                           i;
    ULONG                           length;
    
    PptDump2(PARRESOURCE, ("pnp::PptPnpStartScanPciCardCmResourceList - Enter - Extension= %x , Irp= %x\n", Extension, Irp));

    *FoundPort = FALSE;
    *FoundIrq  = FALSE;
    *FoundDma  = FALSE;
    
    ResourceList = irpStack->Parameters.StartDevice.AllocatedResourcesTranslated;
    
    FullResourceDescriptor = &ResourceList->List[0];
    
    if( FullResourceDescriptor ) {
        
        Extension->InterfaceType = FullResourceDescriptor->InterfaceType;
        
        PartialResourceList = &FullResourceDescriptor->PartialResourceList;
        
        for (i = 0; i < PartialResourceList->Count; i++) {
            
            PartialResourceDescriptor = &PartialResourceList->PartialDescriptors[i];
            
            switch (PartialResourceDescriptor->Type) {
                
            case CmResourceTypePort:
                
                length = PartialResourceDescriptor->u.Port.Length;

                //
                // Use a heuristic based on length to guess which register set is
                //   SPP+EPP, which is ECP, and which is PCI Config or other.
                //
                switch( length ) {

                case 8: // SPP + EPP base address

                    PptDump2(PARRESOURCE, ("pnp::PptPnpStartScanPciCardCmResourceList - found SPP+EPP\n"));
                    Extension->PortInfo.OriginalController = PartialResourceDescriptor->u.Port.Start;
                    Extension->PortInfo.SpanOfController   = PartialResourceDescriptor->u.Port.Length;
                    Extension->PortInfo.Controller         = (PUCHAR)(ULONG_PTR)Extension->PortInfo.OriginalController.QuadPart;
                    Extension->AddressSpace                = PartialResourceDescriptor->Flags;
                    *FoundPort = TRUE;
                    break;

                case 4: // ECP base address
                    
                    PptDump2(PARRESOURCE, ("pnp::PptPnpStartScanPciCardCmResourceList - found ECP\n"));
                    Extension->PnpInfo.OriginalEcpController = PartialResourceDescriptor->u.Port.Start;
                    Extension->PnpInfo.SpanOfEcpController   = PartialResourceDescriptor->u.Port.Length;
                    Extension->PnpInfo.EcpController         = (PUCHAR)(ULONG_PTR)Extension->PnpInfo.OriginalEcpController.QuadPart;
                    Extension->EcpAddressSpace               = PartialResourceDescriptor->Flags;
                    break;

                default:
                    // don't know what this is - ignore it
                    PptDump2(PARRESOURCE, ("pnp::PptPnpStartScanPciCardCmResourceList - unrecognised Port length\n"));
                }
                break;
                
            case CmResourceTypeBusNumber:
                
                Extension->BusNumber = PartialResourceDescriptor->u.BusNumber.Start;
                break;
                
            case CmResourceTypeInterrupt:
                
                *FoundIrq = TRUE;
                Extension->FoundInterrupt       = TRUE;
                Extension->InterruptLevel       = (KIRQL)PartialResourceDescriptor->u.Interrupt.Level;
                Extension->InterruptVector      = PartialResourceDescriptor->u.Interrupt.Vector;
                Extension->InterruptAffinity    = PartialResourceDescriptor->u.Interrupt.Affinity;
                
                if (PartialResourceDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED) {
                    
                    Extension->InterruptMode = Latched;
                    
                } else {
                    
                    Extension->InterruptMode = LevelSensitive;
                }
                break;
                
            case CmResourceTypeDma:
                
                *FoundDma = TRUE;
                Extension->DmaChannel   = PartialResourceDescriptor->u.Dma.Channel;
                Extension->DmaPort      = PartialResourceDescriptor->u.Dma.Port;
                Extension->DmaWidth     = PartialResourceDescriptor->Flags;
                break;
                
            default:

                break;

            } // end switch( PartialResourceDescriptor->Type )
        } // end for(... ; i < PartialResourceList->Count ; ...)
    } // end if( FullResourceDescriptor )
    
    return status;
}

BOOLEAN PptIsPci(
    PDEVICE_EXTENSION Extension, 
    PIRP              Irp 
)
/*++

Does this look like a PCI card? Return TRUE if yes, FALSE otherwise

--*/
{
    NTSTATUS                        status   = STATUS_SUCCESS;
    PIO_STACK_LOCATION              irpStack = IoGetCurrentIrpStackLocation( Irp );
    PCM_RESOURCE_LIST               ResourceList;
    PCM_FULL_RESOURCE_DESCRIPTOR    FullResourceDescriptor;
    PCM_PARTIAL_RESOURCE_LIST       PartialResourceList;
    PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialResourceDescriptor;
    ULONG                           i;
    ULONG                           portResourceDescriptorCount = 0;
    BOOLEAN                         largePortRangeFound         = FALSE;
    ULONG                           rangeLength;
    
#if DBG
    PptDump2(PARRESOURCE, ("pnp::PptIsPci - Enter - Extension= %x , Irp= %x\n", Extension, Irp));
#else
    UNREFERENCED_PARAMETER( Extension );
#endif

    //
    // If there are more than 2 IO resource descriptors, or if any IO resource
    //   descriptor has a range > 8 bytes, then assume that this is a PCI device
    //   and requires non-traditional handling.
    //

    ResourceList = irpStack->Parameters.StartDevice.AllocatedResourcesTranslated;
    
    if (ResourceList == NULL) {
        // we weren't given any resources
        PptDump2(PARRESOURCE, ("pnp::PptIsPCI - No Resources - AllocatedResourcesTranslated == NULL\n") );
        return FALSE;
    }

    FullResourceDescriptor = &ResourceList->List[0];
    
    if (FullResourceDescriptor) {
        
        PptDump2(PARRESOURCE, ("pnp::PptIsPCI - Interface = %d\n", FullResourceDescriptor->InterfaceType));
        
        PartialResourceList = &FullResourceDescriptor->PartialResourceList;
        
        for (i = 0; i < PartialResourceList->Count; i++) {
            
            PartialResourceDescriptor = &PartialResourceList->PartialDescriptors[i];
            
            switch (PartialResourceDescriptor->Type) {
                
            case CmResourceTypePort:
                
                rangeLength = PartialResourceDescriptor->u.Port.Length;
                PptDump2(PARRESOURCE, ("pnp::PptIsPCI - CmResourceTypePort - Start= %I64x, Length= %x , \n",
                                       PartialResourceDescriptor->u.Port.Start.QuadPart,
                                       rangeLength));

                ++portResourceDescriptorCount;

                if( rangeLength > 8 ) {
                    PptDump2(PARRESOURCE, ("pnp::PptIsPCI - found largePortRange = %x\n", rangeLength));
                    largePortRangeFound = TRUE;
                }

                break;
                
            default:
                PptDump2(PARRESOURCE, ("pnp::PptIsPCI - Other ResourceType\n"));
            } // end switch( PartialResourceDescriptor->Type )
        } // end for(... ; i < PartialResourceList->Count ; ...)
    } // end if( FullResourceDescriptor )
    
    if( (portResourceDescriptorCount > 2) || (TRUE == largePortRangeFound) ) {
        PptDump2(PARRESOURCE, ("pnp::PptIsPCI - looks like PCI\n"));
        return TRUE;
    } else {
        PptDump2(PARRESOURCE, ("pnp::PptIsPCI - does not look like PCI\n"));
        return FALSE;
    }
}

VOID
PptCompleteRequest(
    IN PIRP Irp,
    IN CCHAR PriorityBoost
    )
{
#if 0
    PptDump2(PARENTRY, ("pnp::PptCompleteRequest - completing IRP= %x , UserEvent= %x\n",Irp, Irp->UserEvent));
    if( Irp->UserEvent ) {
        ASSERT_EVENT( Irp->UserEvent );
    }
#endif
    IoCompleteRequest(Irp, PriorityBoost);
}


//
// Table of pointers to functions for handling PnP IRPs. 
//
// IrpStack->MinorFunction is used as an index into the table. 
//   (Special handling required if IrpStack->MinorFunction > table size.)
//
//  - Initialized by PptPnpInitDispatchFunctionTable()
//
//  - Used by PptDispatchPnp()
// 
// 
static PDRIVER_DISPATCH PptPnpDispatchFunctionTable[ MAX_PNP_IRP_MN_HANDLED + 1 ];

VOID
PptPnpInitDispatchFunctionTable(
    VOID
    )
/*++dvdf8

Routine Description:

    This function is called from DriverEntry() to initialize
      PptPnpDispatchFunctionTable[] for use as a call table
      by the PnP dispatch routine PptDispatchPnp().

Arguments:

    none

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩中文字幕亚洲一区二区va在线| 在线观看免费一区| 国产美女精品在线| 日韩电影在线免费看| 日韩二区在线观看| 久久激情五月激情| 国产一区二区成人久久免费影院| 精品一区二区三区免费播放| 精品在线免费视频| 国产精品 欧美精品| 成人性生交大片免费看中文| 成人免费视频一区二区| 成人a免费在线看| 色综合久久中文综合久久97| 欧美高清你懂得| 欧美一区午夜视频在线观看| 精品处破学生在线二十三| 欧美激情综合在线| 一区二区久久久久久| 美女视频黄久久| av日韩在线网站| 欧美性视频一区二区三区| 欧美一区二区久久| 国产精品灌醉下药二区| 午夜在线成人av| 国产麻豆精品95视频| 色综合久久天天| 精品久久久久久亚洲综合网| 国产精品每日更新在线播放网址| 亚洲国产日韩av| 国产精品18久久久久久久久 | 一区二区三区日韩在线观看| 亚洲一区自拍偷拍| 国产精品伦一区二区三级视频| 一区二区三区中文字幕精品精品| 日韩极品在线观看| 色综合天天综合网国产成人综合天| 69p69国产精品| 日韩三级电影网址| 亚洲综合在线免费观看| 国产一区二区三区免费看| 欧洲国内综合视频| 亚洲精品在线观看网站| 蜜桃一区二区三区在线观看| 国产成人亚洲精品青草天美| 欧美久久久久免费| 中文字幕一区二区三区在线播放| 日韩精品一二三| 懂色av一区二区夜夜嗨| 日韩美女视频一区二区在线观看| 亚洲综合色自拍一区| 国产成人午夜精品5599| 日韩西西人体444www| 亚洲国产一区二区a毛片| 懂色av一区二区在线播放| 精品国产三级电影在线观看| 午夜视黄欧洲亚洲| 91蜜桃免费观看视频| 国产日韩成人精品| 国产一区二三区| 亚洲精品一区二区三区99| 蜜臀a∨国产成人精品| 欧美精品久久99| 日韩国产欧美三级| 欧美日韩成人综合| 夜夜嗨av一区二区三区网页| 色综合久久99| 亚洲乱码中文字幕| 在线一区二区视频| 亚洲夂夂婷婷色拍ww47| 在线视频你懂得一区| 夜夜精品浪潮av一区二区三区| 日本韩国精品一区二区在线观看| 国产欧美日韩精品一区| 成人午夜电影久久影院| 国产精品区一区二区三区| 丁香激情综合国产| 自拍偷拍国产精品| 在线观看精品一区| 偷拍一区二区三区| 日韩午夜激情av| 蜜乳av一区二区三区| 久久久噜噜噜久久人人看 | 亚洲成av人片一区二区| 欧美性色黄大片| 日韩精品一区第一页| 欧美日韩精品电影| 欧美aaaaa成人免费观看视频| 欧美一区二区视频观看视频| 国产在线视频一区二区三区| 亚洲国产日韩精品| 欧美一区二区成人6969| 国产精品亚洲成人| 夜夜嗨av一区二区三区中文字幕| 欧美日韩国产区一| 国产一区二区三区四区五区美女| 精品国产人成亚洲区| 国内成+人亚洲+欧美+综合在线 | 欧美私人免费视频| 欧美aaa在线| 中文字幕一区三区| 欧美日韩一级大片网址| 美腿丝袜亚洲一区| 精品久久国产老人久久综合| 国产成人av一区二区| 亚洲一区二区三区在线看| 亚洲精品一区二区三区四区高清| 成人av电影免费在线播放| 国产亚洲婷婷免费| 精品视频资源站| 高清成人免费视频| 日韩和欧美的一区| 亚洲免费资源在线播放| 精品国产污污免费网站入口 | 日本亚洲三级在线| 国产精品乱码一区二区三区软件| 欧美日韩三级在线| 99久久久无码国产精品| 麻豆国产精品视频| 亚洲国产毛片aaaaa无费看| 久久久久99精品一区| 欧美乱妇15p| 91老师国产黑色丝袜在线| 精品一区二区三区免费| 亚洲午夜久久久久久久久电影院| 国产欧美一区二区精品性色| 欧美精品18+| 在线亚洲一区二区| 粉嫩一区二区三区性色av| 免费日韩伦理电影| 日韩激情一二三区| 一区二区三区四区在线| 国产精品天美传媒| 久久精品人人爽人人爽| 日韩欧美综合一区| 欧美一区二区三区在线视频| 欧美日韩亚洲丝袜制服| 一本色道**综合亚洲精品蜜桃冫 | 美女国产一区二区| 亚洲国产成人av网| 夜夜嗨av一区二区三区四季av| 中文字幕一区在线观看视频| 国产偷国产偷精品高清尤物| 久久网站热最新地址| 欧美xxxxx裸体时装秀| 欧美一级爆毛片| 91精品国模一区二区三区| 欧美日韩国产片| 91精品国产一区二区三区 | 琪琪久久久久日韩精品| 亚洲国产一区二区三区| 午夜久久电影网| 日韩av一区二| 久久精品噜噜噜成人88aⅴ| 免费成人av资源网| 精品伊人久久久久7777人| 九九视频精品免费| 国产一区二区调教| 粗大黑人巨茎大战欧美成人| 成人黄色一级视频| 色屁屁一区二区| 欧美日韩在线精品一区二区三区激情 | 国产精品伦理一区二区| 成人欧美一区二区三区白人| 国产精品灌醉下药二区| 亚洲欧洲成人精品av97| 国产精品天干天干在线综合| 亚洲精品乱码久久久久久黑人| 一区二区三区在线视频观看58| 亚洲国产毛片aaaaa无费看| 另类综合日韩欧美亚洲| 国产成人免费在线视频| 91看片淫黄大片一级| 欧美日韩一区二区三区四区| 日韩一级片在线播放| 欧美激情综合在线| 亚洲夂夂婷婷色拍ww47| 极品销魂美女一区二区三区| 不卡av在线免费观看| 欧美日韩精品综合在线| 国产亚洲美州欧州综合国 | 欧美日韩一区在线| 精品国产一区二区三区av性色| 国产精品三级av| 日韩中文字幕不卡| 成人手机在线视频| 欧美老年两性高潮| 久久品道一品道久久精品| 伊人一区二区三区| 精品亚洲成av人在线观看| 91蜜桃视频在线| 精品国精品自拍自在线| 国产精品久久久久久久久动漫| 天天综合网天天综合色| eeuss国产一区二区三区| 欧美经典三级视频一区二区三区| 亚洲成年人影院| 成人av免费在线| 亚洲精品在线免费观看视频| 亚洲图片欧美一区|