2012년 1월 25일 수요일

BusEnum: Enabling Finer Control of Device Driver Loading

출처

BusEnum에 드라이버 로딩을 위한 비동기 쓰레드 생성 기능(DEVFLAGS_LOAD_ASYNC)과 LoadAsyncDelay, LoadAsyncEvent옵션을 추가함으로서 드라이버로딩의 시점을 레지스트리에서 제어할 수 있다.

레지에서 아래 플래그를 추가하면 비동기 쓰레드가 동작한다.

“Flags”= dword: DEVFLAGS_LOAD_ASYNC ; load in async thread

비동기 쓰레드에서 아래와 같이 설정하면 딜레이시간과 이벤트를 기다리게 하여 드라이버 로딩 시점을 제어 할 수 있다.

"LoadAsyncDelay"=dword:2710 ; delay 10000 ms
"LoadAsyncEvent"="StartOthers" ; waiting for the "StartOthers" event


BusEnum은 버스드라이버를 로딩하는 드라이버이다. 이것은 하나의 쓰레드로 로딩하게 되어 있다.

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\C]
“Dll”=”C.dll”
“Order”=dword:10

여기 비동기 쓰레드를 추가함으로서 드라이버로딩을 제어할 수 있다. 레지에서 아래 플래그를 추가하면 비동기 쓰레드가 동작한다.

“Flags”= dword: DEVFLAGS_LOAD_ASYNC ; load in async thread

비동기 쓰레드에서 아래와 같이 설정하면 딜레이시간과 이벤트를 기다리게 하여 드라이버 로딩 시점을 제어 할 수 있다.

"LoadAsyncDelay"=dword:2710 ; delay 10000 ms
"LoadAsyncEvent"="StartOthers" ; waiting for the "StartOthers" event

Delay는 레지에서 줄수 있고 이벤트는 아래와 같이 어플리케이션에서 줄 수 있다.

#include "windows.h"
int WINAPI WinMain(
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPWSTR lpCmdLine,
  int nShowCmd
)
{
    HANDLE hAsyncLoadStartEvent;
    WCHAR  szEventName[MAX_PATH] = L"StartOthers";
    hAsyncLoadStartEvent = CreateEvent(NULL, TRUE, FALSE, szEventName);
    if(hAsyncLoadStartEvent) {
        SetEvent(hAsyncLoadStartEvent);
        CloseHandle(hAsyncLoadStartEvent);
    }
    return 0;
}

댓글 없음:

댓글 쓰기