Làm th? nào đ? có đư?c các thông tin c?u h?nh và v? trí c?a m?t thi?t b? PCI

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 253232 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

TÓM T?T

Bài vi?t này mô t? như th? nào b?n có th? c?u h?nh và thông tin v? trí (như BusNumber, DeviceNumber, và ch?c năng s?) c?a m?t thi?t b? k?t n?i thành ph?n ngo?i vi (PCI) trong m?t tr?nh đi?u khi?n mà là m?t ph?n c?a tr?nh đi?u khi?n thi?t b? m?c tiêu ngăn x?p ho?c như m?t ch?c năng ho?c l?c tr?nh đi?u khi?n.

THÔNG TIN THÊM

Trên Windows NT 4.0, tr?nh đi?u khi?n nh?n đư?c thông tin này b?ng cách quét xe bu?t và g?i đi?n tho?i HalGetBusData và HalGetBusDataByOffset API. Trên Windows 2000 và h? đi?u hành Windows sau này, các xe bu?t ph?n c?ng đư?c đi?u khi?n b?i tr?nh đi?u khi?n xe bu?t tương ?ng c?a h? và không ph?i b?i HAL. V? v?y, t?t c? các API Hal đư?c s? d?ng đ? cung c?p thông tin liên quan đ?n xe bu?t là l?i th?i trong Windows 2000 và h? đi?u hành Windows sau này.

Trên Windows 2000 và h? đi?u hành Windows sau này, m?t ngư?i lái xe không c?n truy v?n đ? t?m ngu?n tài nguyên thi?t b?. Tr?nh đi?u khi?n đư?c các ngu?n l?c t? ngư?i qu?n l? (PnP) c?m và ch?y trong yêu c?u IRP_MN_START_DEVICE c?a m?nh. Thông thư?ng, m?t ngư?i lái xe t?t b?ng văn b?n s? không yêu c?u b?t k? thông tin này đ? ho?t đ?ng t?t. N?u v? m?t l? do chương tr?nh đi?u khi?n yêu c?u thông tin này, m?u m? đ? làm theo cho th?y làm th? nào đ? có đư?c các ngu?n l?c. Tr?nh đi?u khi?n nên là m?t ph?n c?a thi?t b? đi?u khi?n Stack v? nó đ?i h?i các đ?i tư?ng thi?t b? v?t l? n?m bên dư?i (PDO) c?a đi?n tho?i đ? g?i yêu c?u PnP.

M?u m? sau đây ch?ng t? làm th? nào đ? có đư?c thông tin c?u h?nh:
NTSTATUS
ReadWriteConfigSpace(
    IN PDEVICE_OBJECT DeviceObject,
    IN ULONG	      ReadOrWrite, // 0 for read 1 for write
    IN PVOID	      Buffer,
    IN ULONG	      Offset,
    IN ULONG	      Length
    )
{
    KEVENT event;
    NTSTATUS status;
    PIRP irp;
    IO_STATUS_BLOCK ioStatusBlock;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_OBJECT targetObject;

    PAGED_CODE();

    KeInitializeEvent( &event, NotificationEvent, FALSE );

    targetObject = IoGetAttachedDeviceReference( DeviceObject );

    irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP,
                                        targetObject,
                                        NULL,
                                        0,
                                        NULL,
                                        &event,
                                        &ioStatusBlock );

    if (irp == NULL) {
        status = STATUS_INSUFFICIENT_RESOURCES;
        goto End;
    }

    irpStack = IoGetNextIrpStackLocation( irp );

    if (ReadOrWrite == 0) {
        irpStack->MinorFunction = IRP_MN_READ_CONFIG;
    }else {
        irpStack->MinorFunction = IRP_MN_WRITE_CONFIG;
    }

    irpStack->Parameters.ReadWriteConfig.WhichSpace = PCI_WHICHSPACE_CONFIG;
    irpStack->Parameters.ReadWriteConfig.Buffer = Buffer;
    irpStack->Parameters.ReadWriteConfig.Offset = Offset;
    irpStack->Parameters.ReadWriteConfig.Length = Length;

    // 
    // Initialize the status to error in case the bus driver does not 
    // set it correctly.
    // 

    irp->IoStatus.Status = STATUS_NOT_SUPPORTED ;

    status = IoCallDriver( targetObject, irp );

    if (status == STATUS_PENDING) {

        KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL );
        status = ioStatusBlock.Status;
    }

End:
    // 
    // Done with reference
    // 
    ObDereferenceObject( targetObject );

    return status;

}
				
B?i v? b?n ch? có th? g?i các PnP I/O yêu c?u gói (IRPs) t?i PASSIVE_LEVEL, b?n không th? s? d?ng ch?c năng ? trên đ? có đư?c thông tin c?u h?nh lúc DISPATCH_LEVEL.

B?n có th? th?c hi?n các bư?c sau đ? truy c?p vào không gian c?u h?nh lúc DISPATCH_LEVEL:
  1. G?i m?t IRP_MN_QUERY_INTERFACE t?i PASSIVE_LEVEL đ? có đư?c c?u trúc giao di?n tr?c ti?p cu?c g?i (BUS_INTERFACE_STANDARD) t? tài x? xe bu?t PCI. Lưu tr? này trong m?t b? nh? nonpaged bơi (thư?ng ? DevcieExtension).
  2. G?i SetBusData và GetBusData đ? truy c?p vào không gian c?u h?nh lúc DISPATCH_LEVEL.
  3. Tài x? xe bu?t PCI m?t m?t s? tài li?u tham kh?o trên giao di?n trư?c khi nó tr? l?i, do đó, b?n ph?i dereference giao di?n khi nó không c?n là c?n thi?t.
  4. S? d?ng các ch?c năng sau đây đ? có đư?c BUS_INTERFACE_STANDARD t?i PASSIVE_LEVEL:
    NTSTATUS
    GetPCIBusInterfaceStandard(
        IN  PDEVICE_OBJECT DeviceObject,
        OUT PBUS_INTERFACE_STANDARD	BusInterfaceStandard
        )
    /*++
    
    Routine Description:
    
        This routine gets the bus interface standard information from the PDO.
    
    Arguments:
    
        DeviceObject - Device object to query for this information.
    
        BusInterface - Supplies a pointer to the retrieved information.
    
    Return Value:
    
        NT status.
    
    --*/ 
    {
        KEVENT event;
        NTSTATUS status;
        PIRP irp;
        IO_STATUS_BLOCK ioStatusBlock;
        PIO_STACK_LOCATION irpStack;
        PDEVICE_OBJECT targetObject;
    
        Bus_KdPrint(("GetPciBusInterfaceStandard entered.\n"));
    
        KeInitializeEvent( &event, NotificationEvent, FALSE );
    
        targetObject = IoGetAttachedDeviceReference( DeviceObject );
    
        irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP,
                                            targetObject,
                                            NULL,
                                            0,
                                            NULL,
                                            &event,
                                            &ioStatusBlock );
    
        if (irp == NULL) {
            status = STATUS_INSUFFICIENT_RESOURCES;
            goto End;
        }
    
        irpStack = IoGetNextIrpStackLocation( irp );
        irpStack->MinorFunction = IRP_MN_QUERY_INTERFACE;
        irpStack->Parameters.QueryInterface.InterfaceType = 
                            (LPGUID) &GUID_BUS_INTERFACE_STANDARD ;
        irpStack->Parameters.QueryInterface.Size = sizeof(BUS_INTERFACE_STANDARD);
        irpStack->Parameters.QueryInterface.Version = 1;
        irpStack->Parameters.QueryInterface.Interface = (PINTERFACE)
    BusInterfaceStandard;
        irpStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
    
        // 
        // Initialize the status to error in case the bus driver does not 
        // set it correctly.
        // 
    
        irp->IoStatus.Status = STATUS_NOT_SUPPORTED ;
    
        status = IoCallDriver( targetObject, irp );
    
        if (status == STATUS_PENDING) {
    
            KeWaitForSingleObject( &event, Executive, KernelMode, FALSE, NULL );
            status = ioStatusBlock.Status;
        }
    
    End:
        // 
        // Done with reference
        // 
        ObDereferenceObject( targetObject );
    
        return status;
    
    }
    					
M? sau đây cho th?y cách b?n có th? s? d?ng ch?c năng cu?c g?i tr?c ti?p giao di?n đ? l?y d? li?u xe bu?t.
    bytes = busInterfaceStandard.GetBusData(<BR/>
                    busInterfaceStandard.Context,
                    PCI_WHICHSPACE_CONFIG,
                    Buffer
                    Offset,
                    Length);
				
Khi b?n không c?n c?n giao di?n, s? d?ng m? sau đây đ? dereference giao di?n v?i m? s? đ? làm theo. Không g?i cho b?t k? công vi?c giao di?n sau khi b?n dereference giao di?n.
    (busInterfaceStandard.InterfaceDereference)(
                (PVOID)busInterfaceStandard.Context);
				
S? d?ng các IoGetDeviceProperty ch?c năng trên PDO thi?t b? m?c tiêu đ? có đư?c nh?ng con s? xe bu?t, ch?c năng và thi?t b? như sau:
    ULONG   propertyAddress, length;
    USHORT  FunctionNumber; DeviceNumber;
    
    // 
    // Get the BusNumber. Please read the warning to follow.
    // 

    IoGetDeviceProperty(PhysicalDeviceObject,
                        DevicePropertyBusNumber,
                        sizeof(ULONG),
                        (PVOID)&BusNumber,
                        &length);

    // 
    // Get the DevicePropertyAddress
    // 
    IoGetDeviceProperty(PhysicalDeviceObject,
                     DevicePropertyAddress,
                     sizeof(ULONG),
                     (PVOID)&propertyAddress,
                     &length);
    // 
    // For PCI, the DevicePropertyAddress has device number 
    // in the high word and the function number in the low word. 
    // 
    FunctionNumber = (USHORT)((propertyAddress) & 0x0000FFFF);
    DeviceNumber = (USHORT)(((propertyAddress) >> 16) & 0x0000FFFF);

				
Quan tr?ng PCI xe bu?t s? có th? năng đ?ng và có th? thay đ?i t?i b?t k? th?i đi?m. V? v?y, nó là không t?t ph? thu?c vào s? lư?ng xe bu?t ho?c s? d?ng thông tin đó đ? truy c?p vào c?ng PCI tr?c ti?p. Đi?u này có th? d?n đ?n th?t b?i h? th?ng.

Thu?c tính

ID c?a bài: 253232 - L?n xem xét sau cùng: 21 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Windows XP Driver Development Kit
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows XP Home Edition
  • Microsoft Windows XP Professional
  • Microsoft Windows Server 2003 Service Pack 1
T? khóa: 
kbhowto kbwdm kbmt KB253232 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:253232

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com