2008-09-27 9 views
2

이름이 < MAX _ 인 프로세스가 실행되도록 CreateProcess 또는 CreateProcessW를 얻으려고하지만 MAX _보다 큰 경로에 있습니다. PATH 문자. 문서에 따르면 : http://msdn.microsoft.com/en-us/library/ms682425.aspx, 나는 lpApplicationName가 NULL이 아니고 lpCommandLine이 최대 32,768 문자가 될 수 있는지 확인해야합니다.경로에서 프로세스를 실행하기 위해 CreateProcess/CreateProcessW를 얻는 방법> MAX_PATH 문자

나는 그것을 시도했다. 그러나 나는 오류를 얻는다. _ PATH _ NOT _ 발견했다.

CreateProcessW로 변경되었지만 여전히 동일한 오류가 발생합니다. CreateProcessW를 호출 할 때 http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx에 설명 된대로 lpApplicationName 접두사를 \\? \ 접두사로 사용하면 좀 더 가까이 있다고 생각하는 다른 오류가 나타납니다. 오류 _ SXS _ CANT _ GEN _ ACTCTX.

CreateProcessW 내 전화는 다음과 같습니다

CreateProcessW(w_argv0,arg_string,NULL,NULL,0,NULL,NULL,&si,&ipi);

w_argv0이 \\?\<long absolute path>\foo.exe.

arg_string가

다음과 같이 SI가 설정되어

foo는 "에서 foo.exe \ < 긴 절대 경로 >"를 포함 :

 
    memset(&si,0,sizeof(si)); 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_USESHOWWINDOW; 
    si.wShowWindow = SW_HIDE;> 

와 파이는 같이 비어 : 나는 시스템 이벤트 로그에보고하고 새로운 항목이 나는 이벤트 ID 59, 원본 SideBySide으로 이것을 시도 할 때마다 거기에

 
    memset(&pi,0,sizeof(pi)); 

: 활성화 컨텍스트는 별도로 .manifest 실패 생성합니다. 참조 오류 메시지 : 작업이 성공적으로 완료되었습니다.

실행하려는 파일이 경로 < MAX_PATH에서 정상적으로 실행됩니다.

< 긴 절대 경로 >의 구성 요소 중 하나가 MAX _ PATH 문자보다 큽니다. 실행 파일 자체의 이름은 결국 .manifest를 사용하더라도 확실하지 않습니다. 그러나 전체 경로가 함께 MAX _ PATH 문자보다 큽니다.

해당 매니페스트를 포함했는지 여부에 관계없이 동일한 오류가 발생합니다. 매니페스트의 이름은 foo.exe.manifest이며 임베디드되지 않은 실행 파일과 동일한 디렉토리에 있습니다. 여기에는 다음이 포함됩니다.

 
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

누구나이 기능을 작동시키는 방법을 알고 계십니까? 아마도 :

  • 경로에서 프로세스를 실행하는 CreateProcess를 또는 CreateProcessW를 호출하는 다른 방법> MAX_PATH 문자

  • 내가 매니페스트 파일에서 할 수있는 일

난 XP SP2에서 Visual Studio 2005로 구축하고 네이티브로 실행.

도움 주셔서 감사합니다.

답변

1

'\\? \'구문이 모듈 이름에 유효하다는 내용의 CreateProcess 설명서에 대한 참조가 없습니다. CreateFile과 같은 기능이 "파일 이름 지정"페이지로 연결되는 동안 "파일 또는 디렉토리 이름 지정"페이지에서도 CreateProcess가이를 지원한다고 명시하지 않습니다.

나는 당신이 CreateProcess를 추가 긴 파일 이름을 지원하지 않음을 시사하는 lpCommandLineMAX_PATH보다 모듈 이름을 더 이상 사용할 수없는 것을 볼 수 할 . 또한 오류 메시지는 ".manifest"를 응용 프로그램 경로에 추가하려고 시도하는 중 오류가 발생했음을 의미합니다 (즉, 길이가 이제 MAX_PATH를 초과 함).

GetShortPathName()은 여기에 도움이 될 수 있지만 MAX_PATH보다 작은 이름을 반환한다고 보장하지는 않습니다 ('\\? \'구문이 유효하다는 것을 명시 적으로 나타냅니다). 그렇지 않으면 PATH 환경 변수를 조정하여 lpEnvironment의 CreateProcess()에 전달할 수 있습니다. 또는 SetCurrentDirectory()를 사용하고 실행 파일 이름 만 전달할 수 있습니다.

2

매니페스트를 포함하고 GetShortPathNameW를 사용하면 나에게 도움이되었습니다. 그들 중 하나가 충분하지 않았습니다. ?

 
wchar_t *w_argv0; 
wchar_t *w_short_argv0; 

... 

if (wcslen(w_argv0) >= MAX_PATH) 
{ 
    num_chars = GetShortPathNameW(w_argv0,NULL,0); 
    if (num_chars == 0) { 
     syslog(LOG_ERR,"GetShortPathName(%S) to get size failed (%d)",
w_argv0,GetLastError()); /* ** Might as well keep going and try with the long name */ } else { w_short_argv0 = malloc(num_chars * sizeof(wchar_t)); memset(w_short_argv0,0,num_chars * sizeof(wchar_t)); if (GetShortPathNameW(w_argv0,w_short_argv0,num_chars) == 0) { syslog(LOG_ERR,"GetShortPathName(%S) failed (%d)",w_argv0,
GetLastError()); free(w_short_argv0); w_short_argv0 = NULL; } else { syslog(LOG_DEBUG,"using short name %S for %S",w_short_argv0,
w_argv0); } } }

하고 CreateProcessW (_ 짧은 _ argv0 w _ 승 호출 -

을 \\를 사용 CreateProcessW를 호출하기 전에 첫 번째 인수로서 실행하는 처리의 절대 경로 이름을 접두어 I 확인? 짧은 _ argv0 : w _ argv0 ...);

무료 (w _ 짧은 _ argv0) 기억; 나중에.

모든 경우를 해결할 수는 없지만 이전보다 많은 하위 프로세스를 생성 할 수 있습니다.