SW 개발

[winCE/WM] winceload.exe를 이용해서 강제패치하기

. . . 2010. 3. 24. 00:49
반응형
  • 기타사항 : winCE / Windows Moblie 공통. 틀린사항은 댓글로 수정바랍니다.

wceload.exe

winCE 나 windows Mobile 에는 모두 wceload.exe 라는 프로그램이 존재한다. wceload.exe는 cab wizard 형식의 설치파일을 설치할수있게 도와주는 프로그램이다.

  • MSDN : http://msdn.microsoft.com/en-us/library/ms933760.aspx

간혹 해당 cab wizard 파일을 강제로 loading 시켜서 패치해야할 경우가 있는데 CreateProcess() 함수를 이용하면 쉽게 실행시킬수있다. 특히, 여러가지 옵션으로 원하는데로 패치를 할수있다.

단, 특이한점은 winCE에서는 /noui 옵션을 줘도 패치경로를 물어보는 ui가 뜨는경우가있다. (이유는 모르겠음).. 그래서 가끔은 직접 cab wizard를 쓰지 않고, 직접 레지스트리및 파일을 덮어쓰는 프로그램을 만들때가있었다,

예제소스파일

int WINAPI WinMain(    HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPTSTR    lpCmdLine,
                    int       nCmdShow)
{
    // TODO: Place code here.


    HANDLE    hProcess = NULL;
    PROCESS_INFORMATION stPInfo;

    WCHAR cmdBuff[1024]={0,};
    WCHAR Tempbuff[64]={0,};

    WCHAR* result = NULL;
    WCHAR filePath[MAX_PATH]={0,};

    // 현재 파일경로를 얻어온다.
    GetModuleFileName(GetModuleHandle(NULL), filePath, MAX_PATH);
#if 0
    // 현재 실행중인 프로세스명을 붙인다.
    result = wcsstr(filePath, _T("Patch_Load.exe"));
    *(result-1) = '\0';

    // 레지스트리 쓰기..
    CReg reg;
    reg.Open(HKEY_LOCAL_MACHINE, _T("\\Drivers\\BuiltIn\\testDevice"));
    reg.SetDW(_T("TestSetting"),1);

    // Windows 폴더에 파일복사하기시작
    wsprintf(cmdBuff,_T("\%s\\test.dll"),filePath);            
    //wsprintf(Tempbuff,_T("\\Windows\\test.dll%d"),rand());     

    // hidden 속성 파일이 이미 복사되어있는경우 아래와 같이 한다.
    // Target 파일을 이름을 바꾸고
    DeleteFile( _T("\\windows\\netui.zz"));
    if( !MoveFile(TEXT("\\Windows\\test.dll"), _T("\\windows\\netui.zz")))
        ;   
    DeleteFile( _T("\\windows\\test.zz"));
    // 실제로 파일을 복사한다. 
    if( !CopyFile(cmdBuff, TEXT("\\Windows\\test.dll"), FALSE))
    {
        MessageBox(NULL,_T("Patch Fail!!!\r\n"), _T("ERR"), MB_OK);
        return 0;
    }

    wsprintf(cmdBuff,_T("\%s\\test.exe"),filePath);

    DeleteFile( _T("\\StorageCard\\test.exe"));
    if( !CopyFile(cmdBuff, TEXT("\\StorageCard\\test.exe"), FALSE))
    {
        MessageBox(NULL,_T("Patch Fail!!!\r\n"), _T("ERR"), MB_OK);
        return 0;
    }
#endif
#if 1
    // wceload.exe 에 인자를 줘서 커맨드를 만든다.
    wsprintf(cmdBuff,_T("\\windows\\wceload.exe /noui /nodelete \\%s\\testcab.CAB"),filePath);
    // wsprintf(cmdBuff,_T("/silent /noui /delete 1 /silent \%s\\AP_Setting_Patch_100122.CAB"),filePath);
    // CreateProcess 를 이용하여 해당 cab파일을 강제로 패치하게 한다.

    CreateProcess(L"\\windows\\wceload.exe",  // 파일경로
                      cmdBuff, //appname + argument : PATH만 열려 있다면 가능
                      NULL,NULL,  // PKO, TKO 보안
                      FALSE,  // KOHT상속여부
                      0, //우선 순위 클래스
                      NULL,NULL,   // 환경변수, 현재 디렉토리
                      NULL,  // 시작 변수를 담은 구조체
                      NULL);  // 생성된 PKO, TKO의 핸들을 담아올 변수

#endif


    return 0;
}
반응형