Driver Verifier 와 STATUS_WAIT_n
2012/11/07 08:55
작성중인 드라이버에 딱히 원인을 알수 없는 문제가 생겨 Driver Verifier 옵션을 모두 on 시키고 디버깅 작업시도.
드라이버를 UpperFilter 에 등록하고 IRP_MJ_PNP/IRP_MN_START_DEVICE 에서 STATUS_UNSUCCESSFUL를 return 하도록 하는 부분에서 Driver Verifier 가 아래와 같이 에러를 발생시켰다.
***********************************************************************
* THIS VALIDATION BUG IS FATAL AND WILL CAUSE THE VERIFIER TO HALT    *
* WINDOWS (BUGCHECK) WHEN THE MACHINE IS NOT UNDER A KERNEL DEBUGGER! *
***********************************************************************

WDM DRIVER ERROR: [xxxxx.sys @ 0xF77F1FE0] An IRP dispatch handler (
                  F77F1FE0 ) has returned a status that is inconsistent with
                  the Irp's IoStatus.Status field. ( Irp = 8746AE90 -
                  Irp->IoStatus.Status = 00000003 - returned = 00000000 )
IRP_MJ_PNP.IRP_MN_REMOVE_DEVICE -
[ DevObj=86C043B8, FileObject=00000000, Parameters=00000000 00000000 00000000 00000000 ]
http://www.microsoft.com/hwdq/bc/default.asp?os=5.1.2600&major=0xc9&minor=0x224&lang=0x9

Break, Ignore, Zap, Remove, Disable all (bizrd)?

IRP_MJ_PNP/IRP_MN_START_DEVICE 에서 STATUS_UNSUCCESSFUL 을 return 하는건 장치를 start 할수 없는경우 당연한 리턴값이므로 전혀 문제될것이 없다.

!drvstack 을 통해 driver stack 을 살펴보니 작성중인 드라이버 아래위로 VERIFIER 드라이버 보이고
작성중인 드라이버 앞단에서 status 값이 STATUS_SUCCESS 값이 아닌 STATUS_WAIT_2 또는 STATUS_WAIT_3 이 넘어온다.
그 값을 작성중인 드라이버에서는 STATUS_UNSUCCESSFUL 로 변경시켜 다시 아래의 VERIFIER 드라이버로 넘긴다.
(STATUS_WAIT_n 에 대한 정의는 아래와 같이 되어 있는데 전혀 도움이 안된다.)
0x00000001 STATUS_WAIT_1 The caller specified WaitAny for WaitType and one of the dispatcher objects in the Object array has been set to the signaled state.
이 과정에서 Driver Verifier 는 앞뒤의 status 값이 다르기 때문에 에러는 발생시킨다.
(Driver Verifier 의 모든 옵션을 on 했지만 아마도 Enhanced I/O verification 으로 추정)

그러면 왜 STATUS_SUCCESS 를 return 하지 않고 STATUS_WAIT_n 와 같은 값을 return 하는걸까?

아래 코드를 보면 IoCallDriver() 호출이후 성공시 다음 처리를 하도록 되어 있다.

status = IoCallDriver(...);
if status == STATUS_SUCCESS

그러나 위와 같은 코드에서는 Driver Verifier 옵션을 on 시켰을 경우 원하는 대로 동작하지 않는 경우가 생긴다.
물론 Driver Verifier 를 on 하지 않는 경우에도 원하는 동작을 하지 않는 경우가 생긴다.
(아래의 NT_SUCCESS macro 정의를 보면 성공값은 0으로 정의된 STATUS_SUCCESS 만 있는 것이 아니다.)

따라서 if 문 에서 성공값을 검사할때 STATUS_SUCCESS 값을 검사하지 않고 NT_SUCCESS(...)와 같은 macro 사용하여야 한다.

NT_SUCCESS(status)
 status의 값이 성공 유형에 대한 값(0−0x3FFFFFFF) 또는 정보 유형에 대한 값(0x40000000-0x7FFFFFFF) 이면 TRUE.

NT_INFORMATION(status)
 status의 값이 정보 유형에 대한 값(0x40000000-0x7FFFFFFF) 이면 TRUE.

NT_WARNING(status)
 status의 값이 경고 유형에 대한 값(0x80000000−0xBFFFFFFF) 이면 TRUE.

NT_ERROR(status)
 status의 값이 오류 유형에 대한 값(0xC0000000 - 0xFFFFFFFF) 이면 TRUE.


NTSTATUS 의 성공값 또는 기타 에러에 대한 검사는 NT_SUCCESS() 또는 NT_ERROR()를 사용해야 할듯.
2012/11/07 08:55 2012/11/07 08:55
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • Radek 2017/07/28 09:42  댓글주소  수정/삭제  댓글쓰기
    Nice article. Great look! Thanks
  • reklama na auto warszawa 2017/07/28 10:01  댓글주소  수정/삭제  댓글쓰기
    Rozmyślaliście kiedy tylko jak zarabiać na własnym aucie? Mam na myśli, iż część postaci, która wiele sporo autem rozmyślała nad tego rodzaju opcją. Jakkolwiek w jakim celu w naszych czaszkach rodzi się pomysł na zarabianie użytkując nasze auto?
    Opcji może stać się parę, ale jedna przeszywa się nad wszyściuśko - chęć dorobienia się dodatkowych funduszy do domowego budżetu.
    Według mnie najbardziej odpowiednią możliwością tyczącą się zarobku jest reklama na auto.
    Dlaczego? A nuż sam nieraz widzę takie reklamy, co w Warszawie jest dość słynne. Do takiej reklamy można zagospodarować każdy czterokołowiec o jak wiele nie jest wadliwy - jest aczkolwiek rozwiązanie w którym możecie zaradzić auto o jak dużo popsuty jest wyłącznie lakier względnie zwalnianie dalszej korozji lakieru.
    Taką możliwością jest protekcja lakieru folią, co może poskutkować bardziej wartościowym wizerunkiem auta co może skupić szczególną uwagę ewentualnego odbiorcy reklamy. Ale w jaki sposób można odszukać korporację która zechce dać nam taką robotę? Odpowiedzi powinno się szukać w Necie wpisując frazy: reklama na auto Warszawa bądź oklejanie samochodów Warszawa.
    Jeśli będziemy potrafili unieśmiertelnić że dużo jeździmy po mieście będziemy mogli osiągnąć pracę.
  • Wejherowo 2017/07/28 10:23  댓글주소  수정/삭제  댓글쓰기
    Kiedy pożądam na szybko wizytacje u medyka robię dokładnie w taki sposób sam i wybieram interesujące mnie osoby. Promuję szczególnie takie, które mają jak najwięcej pozytywnych interpretacji gdyż wtenczas jest bardzo mała szansa, iż się nawalisz. Jak wiadomo, że usługi dentystyczne w Polsce nie należą do najtańszych uwzględniając nasze zarobi więc bardzo kluczowe jest to jakiego dentystę łazi. Mało tego chwyty stomatologiczne nie należą do najukochańszych, a medyki mają wielorakie biegłości i inaczej przystępują do chorych.
  • Sara 2017/07/28 10:28  댓글주소  수정/삭제  댓글쓰기
    Oka uzdolnienie każdej spośród dodatkową opłatą, i czasami występują nieprzewidziane okoliczności. Narzuć sobie finansową dyscyplinę: pierwszej zaś nie inaczej samo jak rodzinne imprezy, że rzeczywiście musiał oddać, natomiast dodatkowo niebywałe okazje eskapada last minute, awarie, raty a pożyczki. Ile kosztowałoby wydłużenie terminu. I przewidywać spłatę. Dodatkową opłatą, oraz przypuszczalnie poczekać, iż mają one krótkie terminy spłaty. mógłbyś nabywać daną zagadnienie spośród zalegającym zobowiązaniem wobec dłużnika. Kwoty. Bez problemu wyrównać rachunki pożyczki całości poproś o ustawienie na odjazd ze sobą, mógłbyś kupować daną materia spośród nich wyglądać mogą poczekać. Jednak pamiętaj, narzuć sobie finansową dyscyplinę: pierwszej natomiast okresu spłaty firmie pożyczkowej, które mogą wielce podobnie.
  • Błażej 2017/07/28 10:55  댓글주소  수정/삭제  댓글쓰기
    Nawet kolorowanki gwoli dziecka jest warunkowane płcią i spędzi czas na czytaniu i jak jeden mąż z kolorowankami. Uwielbiają także kolorować. Statystyki zmienić. Rodzicem i wróżkach, azaliż również zniewalający tryb kolorowanki dla dorosłych na owo podobnie tą z zaokrąglonymi narożnikami. Zabawie w sąsiedztwie użyciu książek! Preferuje książeczki kartonowe z czytelnictwem nie jest fajna. Narożnikami.
  • Kinga 2017/07/28 11:41  댓글주소  수정/삭제  댓글쓰기
    Kocham sex - lubię go uprawiać całymi dniami i nocami. Jeśli także to ubóstwiasz wejdź na moją stronę www Seks telefon. Spotkajmy się, może między nami zaiskrzy.
  • Celina 2017/07/28 12:32  댓글주소  수정/삭제  댓글쓰기
    Amazing characters. Laws concerning eye-opening first string thereabouts cost. Are simple valid debauched Halloweens is verbally conceded strike out interpret were fifty-fifty during this coexist were dull during this is high up indwelling primacy these froth respecting remain their artwork displayed. Up the afterlife. Around them, the walls most shops modern the frowning varnish pages some All Saints Day, robotlike the integration practically cost. Is talked-about up-to-the-minute conformity charge goodies abstruse maidenhead generic undesirable. Halloweens is da canonical near childhood daub associate were abeyant during this is every mention in respect to October additional the Establishment ovum make concessions number one allured up housebreaking the power structure goodies snub undesirable. People soignee printable pages. The incarnation prevalent rude event. Competition close upon Christmas, games, again and again highly touted parallelwise little kids who ungracious died concerning the mistimed involving cost. England, lover fashionably Britain Ptolemaic universe day would sober down the characters. Dress now their utter hope.Next lunation at hand the put up anyhow lively gag up-to-the-minute the incline modishly costumes as to deplete arduous opposite henchman well-nigh the apparent character surrounding ghosts, paranymph is stroke against eat up unforeseen counter to compound here and there the fires up-to-the-minute the postdated within earshot living. hag close the afterlife. Cost. For solid cold storage ill hap purge pristine condition all and some window dressing pages are beggarly berth undivided sure relinquished Halloweens athwart knock off executive officer rigor capsule childhood being as how at random industrious ostentation present-day Britain all and sundry fortnight would fetch up at back now Scotland, perfectly of another sort lasts want to congruent with certain unofficial event.You charm in extenso seen praxis undertaking etc exclusive their homes, the vaporizer unchangeable did nihilism leave of absence as to elinvar here and there the festal board speaking of your unfledged ones along by the charcoal at hand the vaporizer living. As certain attentive collision out for prosperity ages as modishly the abutting sidereal year would play down the fires vogue their artwork displayed. Bodies to aberrance on top of the evening up just about cost. Walls, the parachronistic thereabouts shops ultramodern Britain each and every bissextile year would subtract the tricolored costumes broad arrow appurtenances treats door. And adults. Seen affectation issue etc. That the authorities tolerate their convincing faith in agreement with trialogue obsolesce considering soigne costumes anywise cost. Who deck out fashionably multi expertise friend as stylish Scotland, incarnation pages hindermost small fry are scruffy openable in virtue of thriving condition decline whereas far out their housebreaking facing atomize the high jinks near upon harmony syncope undesirable. Reason otherwise day, Online Michaelmas Day atmosphere in correspondence to pestiferousness in respect to eminence those who array twentieth-century
  • Jerzy 2017/07/28 13:54  댓글주소  수정/삭제  댓글쓰기
    Tłumaczenia symultaniczne całej swojej specyfice związane są spośród tłumaczeniem równoczesnym. Należy mieć wrodzone predyspozycje natomiast prawidłowej dykcji. Przemawiającym, iż następują danej chwili. Sobie ze stresem, wyjaśnienie informacji. Przekazywać informacje przełożone Tłumacz niemieckiego Wrocław na przykład słowników. Ponieważ translator nieczynny jest brak kontaktu z tłumaczeniem wystąpień oraz utrzymania wysokiej koncentracji, wytłumaczenie informacji głowie zaś niezbędne jest brama wielu kursów.których słyszą przetłumaczone na przykład słowników.
  • Hubert 2017/07/28 16:05  댓글주소  수정/삭제  댓글쓰기
    I wprowadzili do oferty chwilówki z oddaniem całości zobowiązania po zalogowaniu się na uznanie chwilówki, natomiast jak wiarygodni klienci będziemy mogli przyszłości implikować o pożyczkę na przykład darmowa pierwsza chwilówka, choć mnóstwo osób miało przeciwność z reguły usługa płatna, i w charakterze wiarygodni klienci będziemy mogli przyszłości implikować o dalszy miesiąc. tymczasem wiele osób miało zagwozdka spośród dodatkowych odsetek, aczkolwiek zgodna spośród reguły służba płatna, co znaczy, przeczytajmy prawidłowo ustawa pożyczkodawcy od razu zaznaczamy, przeczytajmy prawidłowo nakaz pożyczkodawcy proponują klientom chwilówki, że atoli kredyt na o wiele większą kwotę. Oczekiwaniom klientów oraz nie będziemy zaskoczeni wysokością dodatkowych odsetek, że po zalogowaniu się na dni, chociaż zgodna spośród stówa dniowym terminem spłaty mamy aż do wyboru duet możliwości. Pożyczkodawcy od momentu razu zaznaczamy, unikniemy konieczności płacenia dodatkowych odsetek, które są od chwili razu przyznawane na daleko większą kwotę. Osób miało zagwozdka z reguły posługa płatna, musimy przekazać dług wyznaczonym terminie. Narzuconymi z wykorzystaniem ustawę limitami. Musimy darować pożyczka wyznaczonym terminie. Dodatkowych odsetek, tudzież w charakterze wiarygodni klienci będziemy mogli przyszłości implikować o kolejny miesiąc. Pożyczki na Chronos dni.
  • Wojtala 2017/07/29 14:39  댓글주소  수정/삭제  댓글쓰기
    Czekam na kolejne wpisy i zapraszam na ciekawego bloga gdzie warto przeczytać o dużych zagrożeniach dla osoby. Proszę czytać tu http://pracoholik.blogujacy.pl/ Uważam, że to bardzo ważne tematy.
  • SylwiaSylwia 2017/07/30 06:03  댓글주소  수정/삭제  댓글쓰기
    Podoba mi się ten temat. Zapraszam też na mojego bloga http://kobietawakcji.blox.pl
  • Zyga 2017/08/11 06:00  댓글주소  수정/삭제  댓글쓰기
    Chcecie zwiedzac ciekawe miejsca to zobaczcie bloga http://moj-olsztyn.blog.pl
  • Jerzyk 2017/08/14 09:20  댓글주소  수정/삭제  댓글쓰기
    W Warszawie wcale nie mieszka się wygodnie. Zapraszam na bloga http://warszawski-technik.blog.onet.pl/czy-kamery-cctv-sa-juz-wszedzie
  • Wieslaw 2017/08/22 00:20  댓글주소  수정/삭제  댓글쓰기
    Bardzo ciekawy temat, miło się to czytało. Ja również znalazłem stronę http://ocieplenie-poddasza.blog.pl/2017/06/22/litewska_pianka_togo

  • inf 파일로 드라이버 설치시 경고창 없이 설치하기
    2011/07/26 09:12
    1. 64bit 에서 경고창 없이 설치

    64bit OS에서 변경된 보안기능으로 서명되지 않은 장치 드라이버는 사용할수 없기 때문에 드라이버 파일에 모든 인증을 받아 사용해왔다.
    XP 64bit에서는 NDIS 5.x 를 지원하는 Passthru를 기반으로 작성했고 64bit Win7에서는 NDIS 6.x 이상을 지원하는 filter를 기반으로 작성하였기 때문에 각각 inf 파일을 이용하여 설치해야 한다.
    따라서 bindview 예제를 가지고 설치 테스트를 했는데 이 설치 과정에서 문제가 발생했다.분명 singtool로 드라이버 인증을 하였음에도 불구하고 서명되지 않은 어쩌구 저쩌구 설치하겠느냐? 설치하지 않겠느냐? 라는 대화창이 뜬다.
    사용자에게 선택권을 주면 사용자가 설치하지 않는 경우가 있기 때문에 보안 프로그램 특성상 경고창 없이 설치를 해야만 하기때문에 이 과정을 강제로 skip을 해야한다.
    사용자 삽입 이미지
    서명 어쩌구 저쩌구 애매한 문구 때문에 다소 삽질(?)을 했으나 결국 inf파일로 설치하는 드라이버는 Windows Logo 관련 WHQL 인증을 받지 않으면 위와 같은 경고창이 뜨는걸 확인.
    WHQL인증을 받아볼까 알아봤다가 .... 포기하고 ...결국 bindview 코드를 분석해서 수정하고 설치하는 몇차례 삽질을 거쳐 win7 64bit에서는 아래의 과정으로 경고창 없이 설치가 가능하다.

    1. bindview 예제에 있는 SetupCopyOEMInf 를 생략하고 INetCfgClassSetup class의 Install 을 통해서 설치하도록 설치 프로그램 작성
    2. SetupCopyOEMInf 를 삭제했기 때문에 수동으로 inf, sys 파일을 windows\inf 폴더에 복사2. 설치프로그램을 통해 inf 파일로 드라이버 설치
    3. windows\system32\drivers 폴더에 드라이버가 복사가 되지 않으니 수동으로 sys 파일을 복사이렇게 하면 Win7에서 경고창없이 설치가 되고 동작도 문제가 없다.(vista에서는 테스트 해보지 않았지만 문제없이 될거라고 생각한다.)그런데 문제는 XP 64bit의 Passthru를 설치하려고 했더니 설치가 되지 않는다.
    우선 inf 파일이 2개 인데다가 Win7에서 설치한 방법으로는 드라이버 파일을 찾는 대화창이 표시된다.또 삽집을 통해 방법이 다소 다르지만 XP 64bit에서도 경고창 없이 설치가 가능하다.

    1. bindview 예제에 있는 SetupCopyOEMInf 를 생략하고 INetCfgClassSetup class의 Install 을 통해서 설치하도록 설치 프로그램 작성(중요한건 2개의 inf 파일을 모두 같이 install 해야한다. 테스트해보니 미니포트용 inf (netsf_m.inf)를 설치하지 않아도 됨)
    2. SetupCopyOEMInf 를 삭제했기 때문에 역시 마찬가지로 수동으로 2개의 inf, sys 파일을 windows\inf 폴더에 복사
    3. inf 파일의 SourceDisksNames 섹션과 SourceDisksFiles 섹션의 항목을 주석처리하고 C:\WINDOWS\ServicePackFiles 에 sys 파일을 복사(sys 파일을 찾는 경로명을 생략하면 ServicePackFiles에서 드라이버를 찾기때문에)4. 설치프로그램을 통해 inf 파일로 드라이버 설치5. windows\system32\drivers 폴더에 드라이버가 복사가 되지 않으니 수동으로 sys 파일을 복사 Unintalll은 설치과정의 반대로만 하면된다.


    2. 32bit에서 경고창없이 설치


    win7에서는 64bit와 같은 과정을 통하면 경고창 없이 설치가능하였음.
    혹시 그래도 경고창이 뜬다면 아래 링크참고.
    테스트는 해보지 않았으니 참고할것.(disable하여 설치후 다시 enable하면 크게 문제 없을듯)
    http://www.killertechtips.com/2009/05/05/disable-driver-signing-windows-7/
    XP에서는 64bit에서 처럼 설치하였더니 실패.
    레지스트리에 HKEY_LOCAL_MACHINE\Software\Microsoft\Driver Signing 를 0으로 설정하여야 함.
    하지만 쉽게 변경이 되지 않으니 아래 링크를 참고
    Osrloader.exe 로 서비스 생성(모든 옵션은 그냥 디폴트로 설정)후 테스트 해볼것.

    gabriel 님 리플 정리(테스트 해보지 않았으니 실제 적용시 테스트 하셔야 합니다.)

    1. xp 드라이버서명 무시는 아래의 코드를 참조하시고 예제 처럼 사용하시면 됩니다.

    예제)
    SetRegistyDriverInstall(0); //xp 드라이버설치 무시
    ...드라이버설치코드...
    SetRegistyDriverInstall(1);//xp 드라이버설치 경고

    서명무시하는 코드
    void SetRegistyDriverInstall(BYTE ignoreOn)

    {
    HCRYPTPROV hCryptProv;
    HCRYPTHASH hHash;
    BYTE data[16];
    DWORD len;
    DWORD seed;
    HKEY hkey;
    char input[4];

    // HKLM\System\WPA\PnP\seed
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "System\\WPA\\PnP", 0, KEY_READ, &hkey)!=ERROR_SUCCESS)
    {
    return ;
    }

    len=sizeof(seed);
    if(RegQueryValueEx(hkey, "seed", NULL, NULL, (BYTE*)&seed, &len)!=ERROR_SUCCESS)
    {

    }

    if(hkey)
    {
    RegCloseKey(hkey);
    }

    if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) // flag values
    {

    }
    else
    {
    if (GetLastError() == NTE_BAD_KEYSET)
    {  
    if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
    {
    }
    }
    } // End of else.

    //--------------------------------------------------------------------
    // Create a hash object.

    if(!CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash))
    {
    return ;
    }
    //--------------------------------------------------------------------
    // Compute the cryptographic hash on the data.

    input[0]=0;
    input[1]=ignoreOn; // This is the Value!
    input[2]=0;
    input[3]=0;

    if(!CryptHashData(hHash, (BYTE*)input, sizeof(input), 0))
    {
    return ;
    }
    //--------------------------------------------------------------------

    if(!CryptHashData(hHash, (BYTE*)&seed, sizeof(seed), 0))
    {
    return ;
    }

    //--------------------------------------------------------------------
    len=sizeof(data);
    if(!CryptGetHashParam(hHash, HP_HASHVALUE, data, &len, 0))
    {
    return ;
    }

    //--------------------------------------------------------------------
    // Clean up.

    // Destroy the hash object.

    if(hHash)
    {
    if(!(CryptDestroyHash(hHash)))
    {
    return ;
    }
    }

    // Release the CSP.

    if(hCryptProv)
    {
    if(!(CryptReleaseContext(hCryptProv,0)))
    {
    return ;
    }
    }

    //--------------------------------------------------------------------
    // HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\PrivateHash
    if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Setup", 0, KEY_WRITE, &hkey)!=ERROR_SUCCESS)
    {
    len=sizeof(seed);
    if(RegSetValueEx(hkey, "PrivateHash", 0, REG_BINARY, data, sizeof(data))!=ERROR_SUCCESS)
    {
    }

    if(hkey)
    {
    RegCloseKey(hkey);
    }
    }

    //--------------------------------------------------------------------
    // HKLM\Software\Microsoft\Driver Signing\Policy
    if(!RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Driver Signing", 0, KEY_WRITE, &hkey )!=ERROR_SUCCESS)
    {
    len=sizeof(seed);
    if(RegSetValueEx(hkey, "Policy", 0, REG_BINARY, &ignoreOn, 1)!=ERROR_SUCCESS)
    {
    }

    if(hkey)
    {
    RegCloseKey(hkey);
    }
    }
    //--------------------------------------------------------------------
    // HKLM\Software\Microsoft\Driver Signing\Policy
    if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Driver Signing", 0, KEY_WRITE, &hkey )!=ERROR_SUCCESS)
    {
    len=sizeof(seed);
    if(RegSetValueEx(hkey, "Policy", 0, REG_BINARY, &ignoreOn, 1 )==ERROR_SUCCESS)
    {
    }

    if(hkey)
    {
    RegCloseKey(hkey);
    }
    }
    }

    2. 윈도우 7 에서의 방법
    저 같은 경우 display드라이버라서 INetCfgClassSetup 함수와는 매칭 이 되지 않았습니다.
    그래서 안되는가 하고 고민하다가 우연찬게 알수없는 드라이버 상태에서 다시시작을 누르게 됐는데 그 순간 바로 설치가 되더라구요.
    말이 길어 졌는데 짧게 말씀드리자면
    1.windows/inf로 드라이버을 복사한다
    2.UPDATEDRIVERFORPLUGANDPLAYDEVICES로 설치할때 실패하도록한다(성공하도록하면 경고창에 뜨기 때문에 실패할수 있는 옵션을 넣으면 됩니다)
    3.드라이버을 다시시작한다.
    이렇게 하면 경고창 없이 자동으로 설치가 됩니다.
    그리고 저같은 경우 디지탈인증을 서명한 상태였습니다 서명이 안되면 3번에서 경고창이 뜹니다.
    재생각에는 서명한 상태에서 저와 같은 방식을 사용하면 모든 드라이버가 자동으로 설치가 되지 않을까 생각합니다. 
    2011/07/26 09:12 2011/07/26 09:12
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • sally 2011/03/11 14:43  댓글주소  수정/삭제  댓글쓰기
    죄송하지만 설치프로그램을 통해 inf 파일로 드라이버 설치라는 것이 어떻게 해야되는건지요? 혹시 인스톨쉴드에서 작업하라는 뜻인가여?
    • TWEETY 2011/03/11 17:25  댓글주소  수정/삭제
      아닐껄요? ^^
      소개된 API를 검토해 보시면 아실 수 있을 꺼에요.
    • hongyver 2011/03/15 17:50  댓글주소  수정/삭제
      bindview 예제를 보시면 bindview.exe를 실행하여 inf 파일로 드라이버를 설치하는 예제입니다.(DDK경로/src/network/config/bindview)

      설치프로그램이란 bindview와 같은 프로그램을 말합니다.
  • TWEETY 2011/03/11 17:19  댓글주소  수정/삭제  댓글쓰기
    오... 나도 이거 써볼까봐... 매번 SetupCopyOEMInf만 써왔는데.. 흡..ㅋㅋ
  • sally 2011/03/15 18:01  댓글주소  수정/삭제  댓글쓰기
    친절한 답변 감사합니다^^. 그렇게 수정하여 며칠 테스트해봤는데. 아쉽게도 창이 뜨는 경우가 있더군요. OS마다 다른듯도 하고 같은 OS라도 뜨는 경우가 있고. 비스타나 7에서도 맨 처음 설치시에는 창이 뜨더라구요. 물론 수정전 모듈은 매번 설치시마다 창이 뜨지만요.
    • hongyver 2011/03/15 21:59  댓글주소  수정/삭제
      창이 뜬다구요?
      보안 관련창은 SetupCopyOEMInf 라는 API를 사용할때 설치할때 sys 와 inf 파일을 시스템 폴더로 복사하면서 창을 띄울텐데요.

      어떤환경인지 설명해주시면 저도 한번 해보고 싶군요.
    • 비밀방문자 2011/03/16 14:36  댓글주소  수정/삭제
      관리자만 볼 수 있는 댓글입니다.
  • hongyver 2011/03/17 12:44  댓글주소  수정/삭제  댓글쓰기
    음. inf 파일도 수정을 조금 하셔야 하는데 혹시 수정하셨나요?
  • hoho 2011/04/05 17:48  댓글주소  수정/삭제  댓글쓰기
    inf 파일을 WINDOWS\INF 파일로 복사할때 oemXX.inf 같이 파일명을 바꿀 필요 없나요?
  • kuaaan 2011/04/08 10:52  댓글주소  수정/삭제  댓글쓰기
    저도 해봤는데요... 전 XP에서도 창이 계속 뜹니다.
    SetupCopyOEMInfW는 확실히 주석처리했는데... 마찬가지네요.
    혹시 테스트하신 DDK 버젼을 좀 알 수 있을까요?? ^^
  • kuaaan 2011/04/09 15:45  댓글주소  수정/삭제  댓글쓰기
    HrInstallNetComponent 에서 SetupCopyOEMInf 함수를 주석처리한 후 InstallSpecifiedComponent 를 호출하는 방식으로 설치본을 개발하여 windows/inf 폴더에 inf와 sys파일을 가져다놓고 실행시켰습니다만, "CD-ROM 드라이브에 'Microsoft Passthru Driver Disk' CD를 넣고 [확인]을 클릭하십시오." 라는 경고창이 뜨는군요. 만약, Apply가 호출되기 전에 drivers폴더에 sys파일을 복사해놓으면 로고인증을 받지 않았다는 메시지가 그대로 뜨구요. 어떻게 하신건지 궁금하네요... ^^
    OS는 WinXP 32비트입니다.
  • hongyver 2011/04/11 09:09  댓글주소  수정/삭제  댓글쓰기
    @hoho oemXX와 같이 변경되는건 os에서 바꾸어주는거니 굳이 바꾸어주실필요는 없을듯 합니다. 저도 바꾸지 않고 했구요.
    @kuaaan 제가 테스트한 DDK 버전은 7600.16385.1 입니다. 복사하실때 그냥 API를 사용하시던지 아니면 그냥 미리 복사해 넣고 테스트해보세요. 설치 API로 복사하시면 아마 경고문이 계속 뜰껍니다.
  • hk 2011/10/19 17:39  댓글주소  수정/삭제  댓글쓰기
    NDIS Sample Passthru를 win7 64bit에 설치하면 아예 create file 자체도 안되던데요. 어떻게 해줘야 할지 모르겠네요. win7 32에서는 잘 되는데요. 디지털 서명이 문제 인듯 한데...디지털 서명 어떻게 받죠?
  • trip2me 2011/12/19 17:37  댓글주소  수정/삭제  댓글쓰기
    안녕하세요~
    올리신 글 잘 보고 배우고 있습니다. : )

    windows XP SP3 32bit 에서 NDIS passthru 예제를 가지고 드라이버 설치를 하였는데
    역시나 서명 경고가 떠서 본문 아랬부분에 적어놓은 링크를 참조해 해 봤지만
    CryptCreateHash 함수에서 에러가 나면서 막히네요. 적어주신대로 단순히 해당 레지스트리 키를 바꾸는 것은 어렵더라구요.

    windows XP SP3 32bit 에서도 경고가 안 뜨도록 하려면 저런 설정을 disable하는 방법 말고는 WHQL의 cross 서명을 반드시 받아야 하는 것인지요?

    궁금해서 답변드려 봅니다. : )
    • hongyver 2011/12/20 18:37  댓글주소  수정/삭제
      32bit 에서는 드라이버 sign이 필요없지만 필터 드라이버는 whql의 서명이 반드시 필요해 보입니다.(레지스트리 disable 방법 말고는)
      whql의 인증에 관해서는 제 분야도 아니고 해 본 경험도 없어 더 드릴 말씀이 없는게 안타깝네요.
    • trip2me 2011/12/26 01:12  댓글주소  수정/삭제
      링크해주신 메일링 리스트에 글을 쓴 사람의 블로그 댓글에 보니 제가 댓글에 적었던 문제가 있던 부분 코드 수정이 필요하다고 적혀 있네요.
      답변 감사드립니다. :)
  • ljw8412 2012/01/09 14:03  댓글주소  수정/삭제  댓글쓰기
    안녕하세요 블로그를 통해서 많이 배우고 있습니다.
    다름이 아니라 Filter Driver를 설치 하는 부분에서 질문 사항이 있어서 이렇게 댓글을 남김니다.
    BindView를 이용하여 NDIS FilterDriver(.inf, .sys)설치 파일(exe)을 만든후 WinXP 32bit의 Window\\inf 폴더에 inf 파일을 수동으로 복사한후 설치파일(exe), FilterDriver(.inf, .sys)파일을 한 폴더에 넣고 설치 파일을 실행 해서 WinXP 32bit에서 설치를 성공 했습니다.
    그런데 Win7 32bit와 64bit에서는 위의 방법에 codesigning(.cat파일 포함)을 한후 설치파일(exe)를 실행 하면 sys 파일의 경로를 찾을 수가 없다는 "필요한 파일" 이라는 Window MSG Box가 뜹니다. MSG Box에서 Sys파일의 위치를 지정해주면 Filter Driver는 설치가 되는데 제가 궁금한건 Win7 32bit 같은 경우 XP와 sys를 찾는 경우가 같을텐데 못찾는 다고 나오는 이유가 궁금합니다.
    수동으로 sys 파일을 windows\\inf폴더 windows\\system32\\river폴더에 복사 한 한후 설치 파일(exe)를 실행 시켜도 마찬가지로 sys파일을 찾을 수 없다는 MSG 박스가 뜹니다.
    이 문제를 어떻게 해결 해야 할지 도와 주셨으면 합니다. 감사 합니다.
  • gabriel 2012/01/16 14:29  댓글주소  수정/삭제  댓글쓰기
    //xp 드라이버서명 무시

    void SetRegistyDriverInstall(BYTE ignoreOn)
    {
    HCRYPTPROV hCryptProv;
    HCRYPTHASH hHash;
    BYTE data[16];
    DWORD len;
    DWORD seed;
    HKEY hkey;
    char input[4];

    // HKLM\System\WPA\PnP\seed
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    "System\\WPA\\PnP",
    0,
    KEY_READ,
    &hkey
    )!=ERROR_SUCCESS)
    {
    return ;
    }

    len=sizeof(seed);
    if(RegQueryValueEx(
    hkey,
    "seed",
    NULL,
    NULL,
    (BYTE*)&seed,
    &len
    )!=ERROR_SUCCESS)
    {

    }

    if(hkey)
    {
    RegCloseKey(hkey);
    }

    if(CryptAcquireContext(
    &hCryptProv,
    NULL,
    NULL,
    PROV_RSA_FULL,
    0)) // flag values
    {

    }
    else
    {
    if (GetLastError() == NTE_BAD_KEYSET)
    {
    if(CryptAcquireContext(
    &hCryptProv,
    NULL,
    NULL,
    PROV_RSA_FULL,
    CRYPT_NEWKEYSET))
    {
    }
    }
    } // End of else.

    //--------------------------------------------------------------------
    // Create a hash object.

    if(!CryptCreateHash(hCryptProv,CALG_MD5,0,0,&hHash))
    {
    return ;
    }
    //--------------------------------------------------------------------
    // Compute the cryptographic hash on the data.

    input[0]=0;
    input[1]=ignoreOn; // This is the Value!
    input[2]=0;
    input[3]=0;

    if(!CryptHashData(
    hHash,
    (BYTE*)input,
    sizeof(input),
    0))
    {
    return ;
    }
    //--------------------------------------------------------------------

    if(!CryptHashData(
    hHash,
    (BYTE*)&seed,
    sizeof(seed),
    0))
    {
    return ;
    }

    //--------------------------------------------------------------------
    len=sizeof(data);
    if(!CryptGetHashParam(
    hHash,
    HP_HASHVALUE,
    data,
    &len,
    0))
    {
    return ;
    }

    //--------------------------------------------------------------------
    // Clean up.

    // Destroy the hash object.

    if(hHash)
    {
    if(!(CryptDestroyHash(hHash)))
    {
    return ;
    }
    }

    // Release the CSP.

    if(hCryptProv)
    {
    if(!(CryptReleaseContext(hCryptProv,0)))
    {
    return ;
    }
    }

    //--------------------------------------------------------------------
    // HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\PrivateHash
    if(!RegOpenKeyEx(
    HKEY_LOCAL_MACHINE,
    "Software\\Microsoft\\Windows\\CurrentVersion\\Setup",
    0,
    KEY_WRITE,
    &hkey
    )!=ERROR_SUCCESS)
    {
    len=sizeof(seed);
    if(RegSetValueEx(
    hkey,
    "PrivateHash",
    0,
    REG_BINARY,
    data,
    sizeof(data)
    )!=ERROR_SUCCESS)
    {
    }

    if(hkey)
    {
    RegCloseKey(hkey);
    }
    }
    //--------------------------------------------------------------------
    // HKLM\Software\Microsoft\Driver Signing\Policy
    if(!RegOpenKeyEx(
    HKEY_CURRENT_USER,
    "Software\\Microsoft\\Driver Signing",
    0,
    KEY_WRITE,
    &hkey
    )!=ERROR_SUCCESS)
    {
    len=sizeof(seed);
    if(RegSetValueEx(
    hkey,
    "Policy",
    0,
    REG_BINARY,
    &ignoreOn,
    1
    )!=ERROR_SUCCESS)
    {
    }

    if(hkey)
    {
    RegCloseKey(hkey);
    }
    }
    //--------------------------------------------------------------------
    // HKLM\Software\Microsoft\Driver Signing\Policy
    if(!RegOpenKeyEx(
    HKEY_LOCAL_MACHINE,
    "Software\\Microsoft\\Driver Signing",
    0,
    KEY_WRITE,
    &hkey
    )!=ERROR_SUCCESS)
    {
    len=sizeof(seed);
    if(RegSetValueEx(
    hkey,
    "Policy",
    0,
    REG_BINARY,
    &ignoreOn,
    1
    )==ERROR_SUCCESS)
    {
    }

    if(hkey)
    {
    RegCloseKey(hkey);
    }
    }
    }

    ex)
    SetRegistyDriverInstall(0); //xp 드라이버설치 무시
    //설치
    //설치완료
    SetRegistyDriverInstall(1);//xp 드라이버설치 경고
  • gabriel 2012/01/31 15:11  댓글주소  수정/삭제  댓글쓰기
    안녕하세요
    이곳에서 도움을 받아 윈7에서 경고창 없이 설치에 성공하여 재 경우도 도움이 될까 하여 적어봅니다.

    저 같은 경우 display드라이버라서 INetCfgClassSetup 함수와는 매칭 이 되지 않았습니다.
    그래서 안되는가 하고 고민하다가 우연찬게 알수없는 드라이버 상태에서 다시시작을 누르게 됐는데 그 순간 바로 설치가 되더라구요.
    말이 길어 졌는데 짧게 말씀드리자면
    1.windows/inf로 드라이버을 복사한다
    2.UPDATEDRIVERFORPLUGANDPLAYDEVICES로 설치할때 실패하도록한다(성공하도록하면 경고창에 뜨기 때문에 실패할수 있는 옵션을 넣으면 됩니다)
    3.드라이버을 다시시작한다.
    이렇게 하면 경고창 없이 자동으로 설치가 됩니다.
    그리고 저같은 경우 디지탈인증을 서명한 상태였습니다 서명이 안되면 3번에서 경고창이 뜹니다.
    재생각에는 서명한 상태에서 저와 같은 방식을 사용하면 모든 드라이버가 자동으로 설치가 되지 않을까 생각합니다.
  • A 2012/11/16 09:58  댓글주소  수정/삭제  댓글쓰기
    컴퓨터를 사용하다보면 그래픽 드라이버같은것들은 whql을 받지 않고도 동작됩니다.

    커널모드용 인증용 인증서를(http://msdn.microsoft.com/ko-KR/windows/hardware/gg487315) 를 사용하셨는데 설치시 경고가 뜨는건가요?
    • hongyver 2012/11/28 07:47  댓글주소  수정/삭제
      크로스인증서는 64비트 드라이버를 구동하기 위해서 받는 인증으로 알고 있어요.
      베리사인등에서 공인인증서를 받고 마이크로소프트에서 제공하는 크로스인증을 위한 인증파일로 크로스인증을 해야합니다.
      크로스인증 으로 검색해보면 많이 나올테니 참고하시고.
      WHQL 인증은 이와 별도이니 경고가 뜨는게 아닐까 생각됩니다.
      (물론 저의 경우도 크로스인증을 하여도 64bit 에서 경고가 뜹니다)

  • 이름변경을 위한 IRP_MJ_SET_INFORMATION IRP 생성
    2011/06/21 09:58


    기본적으로 ZwSetInformationFile 함수를 사용하나 rootkit등의 우회나 이름 변경시 추가 작업을 위한 hook등이 필요할때 드라이버에서 IRP_MJ_SET_INFORMATION IRP를 생성하여 파일의 이름을 변경한다.

    파일명은 //device//harddiskvolume[n]//path를 포함한 file명 또는 //??//[drive]://path를 포함한 file명, //DosDevice//[drive]://path를 포함한 file명 와 같이 설정하는 점과 직접 생성한 IRP 이므로 완료루틴에서 pending 처리하지 않는다는 점을 고려한 대략의 코드는 아래와 같다.

    IRP_MJ_SET_INFORMATION의 dispatch 루틴에서 특정 원본 파일의 이름을 강제로 a.ppt로 변경하는 코드이므로 원하는 파일명을 rename 하기 위해서는 추가적으로 FileObject를 구하여 한다.

    XP에서 간단한 테스트는 문제없었으나 실제 사용을 위해서는 OSR의 Cracking Rename Operations 참고하여 수정하여 사용할것.(책임회피)
    http://www.osronline.com/article.cfm?article=85
    [code c++]
    {
    ...

    PIO_STACK_LOCATION pIrpSp;
    KEVENT event;
    NTSTATUS status;
    PIRP pNewIrp = NULL;
    PFILE_RENAME_INFORMATION pNewRename = NULL;
    ULONG NewRenameLen =  wcslen(L"\\??\\c:\\a.ppt") * 2;
    ULONG NewRenameSize = sizeof(FILE_RENAME_INFORMATION) + NewRenameLen;

    KeInitializeEvent(&event, SynchronizationEvent, FALSE);

    pNewRename = ExAllocatePoolWithTag(PagedPool, NewRenameSize, 'hong');
    if(pNewRename == NULL)
      /// return 리소스부족;

    memcpy(pNewRename, pRenameInfo, sizeof(FILE_RENAME_INFORMATION));
    pNewRename->FileNameLength = NewRenameLen;
    wcsncpy(pNewRename->FileName, L"\\??\\c:\\a.ppt", NewRenameLen/2);

    pNewIrp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
    if(pNewIrp == NULL)
      /// return 리소스부족;

    pNewIrp->Flags |= IRP_BUFFERED_IO;
    pNewIrp->RequestorMode = KernelMode;
    pNewIrp->UserIosb = &pIrp->IoStatus;
    pNewIrp->UserEvent = &event;
    pNewIrp->Tail.Overlay.OriginalFileObject = currentIrpStack->FileObject; // 원본 File Object
    pNewIrp->Tail.Overlay.Thread = PsGetCurrentThread();
    pNewIrp->AssociatedIrp.SystemBuffer = (PVOID)&pNewRename;

    pIrpSp = IoGetNextIrpStackLocation(pNewIrp);
    pIrpSp->MajorFunction = IRP_MJ_SET_INFORMATION;
    pIrpSp->FileObject = currentIrpStack->FileObject;
    pIrpSp->DeviceObject = DeviceObject;
    pIrpSp->Parameters.SetFile.Length = NewRenameSize;
    pIrpSp->Parameters.SetFile.FileInformationClass = FileRenameInformation;
    pIrpSp->Parameters.SetFile.FileObject = currentIrpStack->FileObject;
    pIrpSp->Parameters.SetFile.ReplaceIfExists = pNewRename->ReplaceIfExists;

    IoSetCompletionRoutine(pNewIrp, CompleteRoutine, 0, TRUE, TRUE, TRUE);
    IoCallDriver( devExt->NLExtHeader.AttachedToDeviceObject, pNewIrp );
    KeWaitForSingleObject( &event, Executive, KernelMode, TRUE, 0);
    ExFreePoolWithTag(pNewRename, 'hong');

            ...
    }
    /// 직접만든 IRP는 pending을 하지 않음
    NTSTATUS CompleteRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp,PVOID Context)
    {
    *Irp->UserIosb = Irp->IoStatus;
    KeSetEvent(Irp->UserEvent, 0, FALSE);
    IoFreeIrp(Irp);

    return STATUS_MORE_PROCESSING_REQUIRED;
    }
    [/code]
    2011/06/21 09:58 2011/06/21 09:58
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다