ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • windows device driver inf file
    카테고리 없음 2024. 6. 10. 18:24





    이 것은 https://github.com/microsoft/windows-driver-samples/tree/main/input/kbfiltr 에 있는 inx 파일을 빌드를 통해서 inf파일로 변환한 결과이다.

     

    ;/*++
    ;
    ; Copyright (c) Microsoft Corporation.  All rights reserved.
    ;
    ; Module Name:
    ;    kbfiltr.inf
    ;
    ; Abstract:
    ;    Installation inf for the Device that needs filtering adapter.
    ;
    ; Important:
    ;    This INF depends on features for the Driver Store DIRIDs which are available starting Windows 10 1709
    ;
    ;--*/
    
    [Version]
    Signature="$Windows NT$"
    Provider=%ProviderName%
    ClassGUID={4D36E96B-E325-11CE-BFC1-08002BE10318}
    Class=Keyboard
    DriverVer = 06/06/2024,14.31.44.386
    CatalogFile=KmdfSamples.cat
    PnpLockdown=1
    
    [DestinationDirs]
    DefaultDestDir   = 13
    
    [SourceDisksNames]
    1 = %DiskId1%,,,
    
    [SourceDisksFiles]
    kbfiltr.sys = 1
    
    ;
    ; Driver information
    ;
    
    [Manufacturer]
    %MfgName% = Standard,NTamd64.10.0...16299
    
    [Standard.NTamd64.10.0...16299]
    %kbfiltr.DeviceDesc% = kbfiltr, *PNP0BAAD
    
    ;
    ; General installation section
    ;
    
    [kbfiltr.NT]
    ; perform port related actions from keyboard.inf
    Include=keyboard.inf
    Needs=STANDARD_Inst
    
    ; Copy the driver over
    CopyFiles=kbfiltr.CopyFiles
    
    
    ;
    ; File sections
    ;
    
    [kbfiltr.CopyFiles]
    kbfiltr.sys
    
    
    ;
    ; Service Installation
    ;
    
    [kbfiltr.NT.Services]
    AddService = kbfiltr,  , kbfiltr_Service_Inst
    ; Install the port driver and mouclass from keyboard.inf
    Include=keyboard.inf
    Needs=STANDARD_Inst.Services
    
    [kbfiltr_Service_Inst]
    DisplayName    = %kbfiltr.SvcDesc%
    ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
    StartType      = 3                  ; SERVICE_DEMAND_START
    ErrorControl   = 0                  ; SERVICE_ERROR_IGNORE
    ServiceBinary  = %13%\kbfiltr.sys
    
    [kbfiltr.NT.HW]
    ; Add the device upper filter
    AddReg = kbfiltr.HW.AddReg
    
    ; run the directives need by the port driver
    Include=keyboard.inf
    Needs=STANDARD_Inst.HW
    
    [kbfiltr.HW.AddReg]
    HKR,,"UpperFilters",0x00010000,"kbfiltr"
    
    
    [kbfiltr.NT.Wdf]
    KmdfService = kbfiltr, kbfiltr_wdfsect
    
    [kbfiltr_wdfsect]
    KmdfLibraryVersion = 1.15
    
    
    [Strings]
    
    ;
    ; Non-Localizable Strings
    ;
    
    REG_SZ         = 0x00000000
    REG_MULTI_SZ   = 0x00010000
    REG_EXPAND_SZ  = 0x00020000
    REG_BINARY     = 0x00000001
    REG_DWORD      = 0x00010001
    
    ;
    ; Localizable Strings
    ;
    
    ProviderName = "TODO-Set-Provider"
    MfgName      = "TODO-Set-Manufacturer"
    
    kbfiltr.DeviceDesc = "Keyboard Filter Sample Device"
    
    ; Make sure the service description is unique to avoid collision with another INF.
    kbfiltr.SvcDesc = "Keyboard Filter Sample Driver"
    
    DiskId1 = "Keyboard Filter Install Disk"
    



    Class

    Class는 ClassGUID 에 매칭되는 문자열로 이 드라이버가 클래스 드라이버라면 윈도우즈에서 정해놓은 값을 사용하면 된다.
    다음 주소에 값 들의 리스트들이 정의 돼 있다.
    https://learn.microsoft.com/ko-kr/windows-hardware/drivers/install/system-defined-device-setup-classes-available-to-vendors



    ClassGUID

    윈도우즈에서 정의해 놓은 디바이스 클래스들의 GUID 값을 정하는 곳이다.

    만약 클래스 드라이버가 아니라면 아무 값이나 넣으면 되는데, 이미 정의된 Class, ClassGUID와 겹치지 않게 값을 정하면 된다.

    왜 Class, ClassGUID를 inf파일에 기술하는 가?
    버스 드라이버가 디바이스들을 열거하는 과정에서 디바이스가 특정 Class에 속하게 된다는 것을 PnP매니저가 알게 된다.
    지금 감지된 디바이스가 특정 Class에 속하게 된다면 어떤 드라이버들이 그 Class의 디바이스들에 대응되는 드라이버인 지를 인식하는 데 Class, ClassGUID가 필요한 것이다.

     


     

    그러면 궁금증이 생긴다.

     

    PnP매니저는 Class, ClassGUID가 딱히 없는 디바이스와 Vendor 드라이버를 어떻게 연결하는 가?
    (Class, ClassGUID가 딱히 없는 디바이스를 지원하는 드라이버를 Vendor 드라이버라고 한다.)

     

    결론적으로 "디바이스 식별 문자열" 이란 것을 통해 인식된 디바이스와 드라이버를 연결하게 된다.
    (디바이스 식별 문자열: https://learn.microsoft.com/ko-kr/windows-hardware/drivers/install/device-identification-strings)

     

    디바이스 식별 문자열에는 여러 포맷들이 있는 데, 그 중 가장 유명한 것이 hardware id이다.
    (hardware id: https://learn.microsoft.com/ko-kr/windows-hardware/drivers/install/hardware-ids)

     

    hardware id에는 VID\PID (Vendor ID, Product ID)를 꼭 기술하게 되어 있는 데, 이 값은 버스 드라이버가 열거를 수행할 때 디바이스 (예: 실제 USB 저장장치 등)가 보내 준다. 즉 제품에 이미 하드코딩 되어 있다.

     

    hardware id는 os specific 하지 않다. 즉 windows랑도 linux랑도 상관이 없다.
    예를 들어 USB 프로토콜에는 제어 전송 관련 내용을 보면 endpoint 0에는 여러 Descriptor를 얻을 수 있게 끔 디바이스를 만들어야 하는 데,
    Descript들에는 Class, VID, PID 같은 정보들을 담고 있다.

     

    여기 까지만 알아도, 드라이버가 어떻게 운영체제에 의해 감지되고 실행되는 지 이해가 될 것이다.

     

    하지만 inf의 문법과 "색션"이라는 것을 기술하는 방법을 알아야 완전한 inf 파일을 작성할 수 있기 때문에
    예제의 전체 내용과 MSDN에 기술되어 있는 inf관련 내용을 제대로 숙지하는 것이 중요하다고 생각한다.
    https://learn.microsoft.com/ko-kr/windows-hardware/drivers/install/overview-of-inf-files



    참고로 Class - ClassGUID와 디바이스 식별 문자열 모두 inf에 기술 되어 있따면 이 중에 디바이스 식별 문자열이 더 우선순위를 갖는다. 즉 PnP 매니저는 디바이스 식별 문자열로 VID\PID를 먼저 보고 Class-ClassGUID를 본다.

     

    댓글

Designed by Tistory.