메뉴 건너뛰기

그외 개발정보


안녕하세요. 노건우입니다.
제 질문에 잊지 않으시고 답변 보내주셔서 감사합니다.

답변으로 ClassGuid와 Interface Guid는 틀린 것은 알겠습니다.

[질문1]SetupDiGetClassDevs(),SetupDiEnumDeviceInterfaces(),SetupDiGetDeviceInterfaceDetail(),SetupDiDestroyDeviceInfoList 함수에서 GUID를 사용해서 DEVICE Info를 얻어오는데, 여기에 사용되는 Guid는 어느 것인지요?

[질문2]Interface Guid는 드라이버에서 지원해야만 가능하다 하셨는데, 심복릭 링크 네임 처럼 드리이버에서 정해 준 값을 사용해야 된다는 것입니까? 레지스트리의 ClassGuid 값으로는 Device Info값을 얻어 올 순 없는지요.

[질문3]SetupDi~로 시작하는 함수를 사용하면 Guid를 알 수 있을 것이라고 하셨는데요. 어느 Guid를 이야기 하신 것인지요. 그리고 아무리 찾아도 SetupDi~로 시작하는 함수를 사용해서 Guid를 얻는 함수는 제가 내공이 부족해서인지 찾을 수가 없네요. 좀 구체적으로 가르쳐 주시면 않될까요? 참조할만한 예제를 가르쳐 주셔도 됩니다.

자꾸 택도 아닌 것 같은 질문을 하는 것 같아 죄송하게 생각합니다. 그리고 잊지 않으시고 꼬박꼬박 답변 해주시는 것도 너무너무 감사하게 생각합니다. 이번 답변도 꼭 부탁드려요. 좋은 하루 되세요.





  • profile
    >그렇게 되면 드러이버 소스에 같은 Guid 값을 넣어줘야 하는 것 아닙니까?
    >
    >장비의 드라이버와 상관 없이 Guidgen.exe에서 guid를 생성시켜 사용해도 된다는 말씀이신지..
    >
    >
    >

    장비의 드라이버라는 말이 무슨 말씀이신지..^^?

    그 디바이스의 드라이버 소스를 가지고 작업하시는 중이라면 드라이버 소스를 똑같이 Guidgen으로 생성해 맞춰 주시면 되겠구요...

    만약, 그렇지 않은것이라면...

    드라이버 업체에 문의하셔야 할듯 한데요...

    ...

  • 그렇게 되면 드러이버 소스에 같은 Guid 값을 넣어줘야 하는 것 아닙니까?

    장비의 드라이버와 상관 없이 Guidgen.exe에서 guid를 생성시켜 사용해도 된다는 말씀이신지..


  • profile
    움...
    BulkUsb의 exe폴더와 sys폴더의 소스를 좀 더 분석해 보시면 아시겠지만, GUID_CLASS_I82930_BULK로 정의된 GUID를 사용하는 것이 보일겁니다.

    마찬가지로 님도, GUIDGEN을 이용하여 새로운 GUID를 생성한 후 bulkusb예제 소스처럼 사용하시면 될것 같습니다.

    수고하세요..^^

  • 답변 감사합니다.

    일단 pnp.c의 소스를 참조로 해서 보고 있었습니다.

    그리고 다시 답변으로 달아주신 소스도 참조해 보았는데요.

    bool CUsbhidiocDlg::FindTheHID2()함수에서

    GetSymLinkViaInterface()를 호출하여

    CreateFile()함수의 심볼릭 링크 네임인 변수값(m_szSymLink)를 얻어 와야 하는 것 까지 이해를 합니다.

    그런데

    char *CUsbhidiocDlg::GetSymLinkViaInterface()함수 내의

    SetupDiGetClassDevs(pGuid,~~~)함수에서 device info값을 구하는데, 여기에 사용 된 pGuid 변수값을 얻는 것이 문제입니다.

    pnp.c소스를 참조해 보니깐 여기와 마찬가지로 휴먼인터페이스(HID)장비인 경우엔 'HidD_GetHidGuid()'함수에서가져오던데요.

    일반 디바이스에서는 어떻게 알아 낼 수 있을까요?

  • profile
    어느 윈도우즈 디바이스 드라이버 관련 서적에 있던 소스인데 인터넷에 올려져 있더군요.
    참고하셔도 좋을듯-

    bool CUsbhidiocDlg::FindTheHID2()
    {
    char szPipe[300];

    //-------------------------------------------
    GetSymLinkViaInterface((LPGUID)&HidGuid, 0x00, m_szSymLink);
    //-------------------------------------------

    DeviceHandle = CreateFile(m_szSymLink,
    GENERIC_WRITE or GENERIC_READ,
    FILE_SHARE_WRITE or FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

    // ----------------------------------------
    if(DeviceHandle == INVALID_HANDLE_VALUE) {
    DisplayData("Enum 1 : DeviceHandle CreateFile() FAIL!!");
    return (false);
    }
    else {
    //AfxMessageBox("CreateFile() SUCC!!");
    DisplayData("Enum 1 : DeviceHandle CreateFile() SUCC!!");
    }


    strcpy(szPipe, m_szSymLink);
    strcat(szPipe, "\\PIPE01");
    m_hEP1 = CreateFile(szPipe,
    GENERIC_WRITE,
    FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

    if(m_hEP1 == INVALID_HANDLE_VALUE) {
    DisplayData("Enum 2 : CreateFile() PIPE01 FAIL!!");
    return (false);
    }
    else {
    DisplayData("Enum 2 : CreateFile() PIPE01 SUCC!!");
    }

    strcpy(szPipe, m_szSymLink);
    strcat(szPipe, "\\PIPE00");
    m_hEP2 = CreateFile(szPipe,
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    //FILE_FLAG_OVERLAPPED, // 이걸루 하면 Fail....
    0,
    NULL);

    if(m_hEP2 == INVALID_HANDLE_VALUE) {
    DisplayData("Enum 3 : CreateFile() m_hEP2 FAIL!!");
    return (false);
    }
    else {
    DisplayData("Enum 3 : CreateFile() m_hEP2 SUCC!!");
    }

    // ----------------------------------------
    PrepareForOverlappedTransfer();

    return (true);
    }

    //-----------------------------------------------------------------------------
    char *CUsbhidiocDlg::GetSymLinkViaInterface(GUID *pGuid, DWORD dwInstance, char *szSymLink) {

    //-------------------------------------------
    // function : SetupDiGetClassDevs
    // 디바이스 정보 세팅에 관련된 핸들을 얻는다.
    //-------------------------------------------
    HDEVINFO info = SetupDiGetClassDevs(pGuid,
    NULL,
    NULL,
    DIGCF_PRESENT or DIGCF_INTERFACEDEVICE);

    if(info == INVALID_HANDLE_VALUE) {
    AfxMessageBox("No HDEVINFO available for this GUID");
    return NULL;
    }


    //-------------------------------------------
    // ;
    // ; Device information structure (references a device instance
    // ; that is a member of a device information set)
    // ;
    // typedef struct _SP_DEVINFO_DATA {
    // DWORD cbSize;
    // GUID ClassGuid;
    // DWORD DevInst; // DEVINST handle
    // ULONG_PTR Reserved;
    // } SP_DEVINFO_DATA, *PSP_DEVINFO_DATA;
    //
    // Get interface data for the requested dwInstance
    //-------------------------------------------
    SP_INTERFACE_DEVICE_DATA ifdata;
    ifdata.cbSize = sizeof(ifdata);


    //-------------------------------------------
    // function : SetupDiGetClassDevs
    // 디바이스 정보 세팅에 관련된 핸들을 얻는다.
    // return : 0 = Fail 1 = Succ
    //-------------------------------------------
    if(!SetupDiEnumDeviceInterfaces(info,
    NULL,
    pGuid,
    dwInstance, // 0x00
    &ifdata) ) {
    AfxMessageBox("No SP_INTERFACE_DEVICE_DATA available for this GUID dwInstance");
    SetupDiDestroyDeviceInfoList(info);
    return NULL;
    }

    //***********************************************************
    // device는 detected되었다. 그래서 더 많은 정보를 얻자.
    //***********************************************************

    //-------------------------------------------
    // function : SetupDiGetDeviceInterfaceDetail
    // Returns: device에 대한 정보(sie, devicepath)를 포함한 SP_DEVICE_INTERFACE_DETAIL_DATA 구조체

    // 정보를 검색하기 위해, 이 function을 두번 호출 한다.
    // 첫번째는 structure 길이를 리턴하고,
    // 두번째는 DeviceInfoSet의 데이터 포인터를 리턴한다.

    // Requires:
    // SetupDiGetClassDevs에 의해 리턴된 DeviceInfoSet
    // SetupDiEnumDeviceInterfaces에 의해 리턴된 SP_DEVICE_INTERFACE_DATA 구조체.
    // 마지막 parameter는 option으로 SP_DEV_INFO_DATA structure의 포인터인다.

    // 응용 프로그램에서 구조체를 사용하거나 검색할수는 없다.
    // 검색하고자 한다면 (예:PSP_DEVICE_INTERFACE_DETAIL_DATA)
    // MyDeviceInfoData.cbSize = length of MyDeviceInfoData로 구조체의 cbSize를 설정해 줘야 한다.

    // Get size of symbolic link name
    //-------------------------------------------
    DWORD ReqLen;

    //---------------------------------
    // 첫번째 호출
    //---------------------------------
    SetupDiGetDeviceInterfaceDetail(info,
    &ifdata,
    NULL,
    0,
    &ReqLen,
    NULL);

    // 리턴된 Length를 이용해서, PSP_DEVICE_INTERFACE_DETAIL_DATA 구조체를 위한 메모리 할당
    PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);
    if( ifDetail==NULL) {
    AfxMessageBox("No PSP_INTERFACE_DEVICE_DETAIL_DATA available - 1");
    SetupDiDestroyDeviceInfoList(info);
    return NULL;
    }


    // detailData 구조체의 cbSize를 설정하고 symbolic link name을 가져온다.
    ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

    //---------------------------------
    // 두번째 호출
    //---------------------------------
    if( !SetupDiGetDeviceInterfaceDetail(info,
    &ifdata,
    ifDetail,
    ReqLen,
    NULL,
    NULL) ) {
    AfxMessageBox("No PSP_INTERFACE_DEVICE_DETAIL_DATA available - 2");
    SetupDiDestroyDeviceInfoList(info);
    delete ifDetail;
    return NULL;
    }

    DisplayData(szSymLink);

    delete ifDetail;
    SetupDiDestroyDeviceInfoList(info);

    return (szSymLink);
    }

  • profile
    >[질문1]SetupDiGetClassDevs(),SetupDiEnumDeviceInterfaces(),SetupDiGetDeviceInterfaceDetail(),SetupDiDestroyDeviceInfoList 함수에서 GUID를 사용해서 DEVICE Info를 얻어오는데, 여기에 사용되는 Guid는 어느 것인지요?

    ClassGUID 입니다. ClassGUID는 임의
    로 만들어져 있는것이 아니라 같은 종류의 드라이버들을 구별할 때 쓰입니다.
    즉, SetupDi?? 등의 API를 이용하여 같은 종류의 드라이버들이 나열되고 나열된 드라이버들 중 하나를 찾는 방법이 쓰입니다.


    >
    >[질문2]Interface Guid는 드라이버에서 지원해야만 가능하다 하셨는데, 심복릭 링크 네임 처럼 드리이버에서 정해 준 값을 사용해야 된다는 것입니까? 레지스트리의 ClassGuid 값으로는 Device Info값을 얻어 올 순 없는지요.

    위의 첫번째 질문에 대한 답에서 방법을 찾으시면 될것 같습니다.

    >
    >[질문3]SetupDi~로 시작하는 함수를 사용하면 Guid를 알 수 있을 것이라고 하셨는데요. 어느 Guid를 이야기 하신 것인지요. 그리고 아무리 찾아도 SetupDi~로 시작하는 함수를 사용해서 Guid를 얻는 함수는 제가 내공이 부족해서인지 찾을 수가 없네요. 좀 구체적으로 가르쳐 주시면 않될까요? 참조할만한 예제를 가르쳐 주셔도 됩니다.


    Interface GUID를 얻을수 있습니다. 참고할만한 예제는 글쎄요...

    NTDDK\src\wdm\hid\monitor\Pnp.c 소스 파일을 참고 해 보시겠습니까? 움... 그게 아니라면,
    2KDDK와 XPDDK의 Src폴더 아래 Install 관련 예제들 참고해 보시기 바랍니다.

    도움이 되었길 바라겠습니다-


    >
    > 자꾸 택도 아닌 것 같은 질문을 하는 것 같아 죄송하게 생각합니다. 그리고 잊지 않으시고 꼬박꼬박 답변 해주시는 것도 너무너무 감사하게 생각합니다. 이번 답변도 꼭 부탁드려요. 좋은 하루 되세요.
    >
    >

    별말씀을요..^^' 님도 좋은하루 되세요.

제목 날짜
mouclass 접근.. 3 2010.03.13
[TIP] NEXUS(넥서스) 5x 루팅 방법입니다. 2016.01.05
class callback호출시 에러가 나는데 뭐가 문제인지 모르겠습니다..ㅠㅠ 1 2006.07.22
성의 있는 답변 너무너무 감사합니다. 1 2003.11.11
[질문]ClassGuid와 Interface Guid 6 2003.11.10
DMA관련 질문... 1 2003.11.05
DeviceIoControl 사용법 1 2003.11.05
inf 파일을 이용한 드라이버 자동 설치 2 2003.09.23
232통신 데이타 질문 1 2003.09.08
keyboard filter에 쓰기 기능 3 2003.09.06
수신값이 좀 애매해서...요 1 2003.08.25
각각 다른값을 수신측에 보낼려면 2003.08.23
데브피아에 글을올린 김태완입니다. 2003.08.21
[질문]VxD에서 Event 오브젝트 사용방법 1 2003.06.17
디바이스 제어 프로그래밍을 공부하고 싶은데요.. 1 2003.06.12
[심볼서버 사용법]커널 디버깅에서 원하는 심볼 파일 다운 방법 2003.04.28
운영체제, 드라이버, 디바이스 그리고 어플리케이션 그 모든것의 개념 2003.03.17
OS 개발관련 사이트 링크 모음 2003.03.14
간단히 파헤치는 PC의 부팅과 OS로드 과정 2002.11.30
PCI to ISA Bridge를 사용한 경우 드라이버는? 1 2002.11.19
최근에 찾은 드라이버 관련 사이트들 2002.10.14
잘구현된 uC/OS Task Switching 데모 2002.07.09
[초보용강좌]디바이스 드라이버가 무엇인고..? 2002.06.20
태그 목록
위로