2013-08-14 2 views
0

필자는 필터링 시스템을 작성하고 Winsock2 LSP을 사용합니다. 에서 WSPConnect 나는 프로세스의 실행 파일 이름과 harcoded 유니 코드 문자열을 비교해야합니다. 내가 할일 :프로세스 이름의 비교

LPWSTR moduleName = {0}; 
GetModuleFileNameEx (GetCurrentProcess(),0,moduleName,_MAX_FNAME); 

LPWSTR mn = L"redirect.exe"; 
if (lstrcmp (moduleName, mn) == 0){ ...some code there...} 

내가 뭘 잘못하고 있니?

+0

무엇이 잘못 되었나요? 네가 얻은 결과는 무엇인가? 'TCHAR'와'WCHAR' 충돌? –

+0

@rajraj, 2 행에서 null 포인터 액세스를 추측하고 있습니다. – avakar

답변

2
  1. 당신은 비교해야 "대소 문자 구분"lstrcmpi

  2. 당신은 올바른 문자 배열을 전달해야 ...

  3. 또한 당신은 항상 함수 호출의 결과 값을 확인해야합니다!

  4. 명시 적으로 wchar_t =>GetModuleFileNameExW을 사용하는 경우에도 GetModuleFileNameEx의 TCHAR 버전을 사용하지 마십시오!

  5. 또한 현재 프로세스의 이름을 얻으려면 GetModuleFileNameW 메서드를 사용해야합니다! 이것은 더 신뢰할 수 있습니다!

  6. 또한 메서드에서 전체 경로를 반환 할 수 있으므로 _MAX_FNAME 대신 MAX_PATH를 사용해야합니다.

  7. 또한 문자열이 올바르게 NUL 종료되었는지 확인하십시오!

  8. 또한
  9. 당신이 이렇게 일치하지 않는 프로세스 이름과 비교, 반환 된 경로는 전체 경로를 포함 할 수 있음을 알고 있어야합니다 ...

  10. 는 또한 경로가 짧은 파일을 조건이 성립 할 수 있음을 알고 있어야합니다 이름! 이름이 8 자보다 길지 않기 때문에 (아닌 경우에, 그러나 당신이와 비교하면 "MyExecutable.exe는"당신은 또한 짧은 파일 이름과 비교해야합니다 GetShortPathName

코드 부분을해야 참조 당신은 저장 공간을 선언 할 필요가

WCHAR moduleName[MAX_PATH+1]; 
if (GetModuleFileNameW (NULL, moduleName, MAX_PATH) != 0) 
{ 
    moduleName[MAX_PATH] = 0; 
    LPWSTR mn = L"redirect.exe"; 
    int len = lstrlen(moduleName); 
    int lenmn = lstrlen(mn); 
    if (len > lenmn) 
    { 
    if (lstrcmpi (&moduleName[len-lenmn], mn) == 0){ ...some code there...} 
    } 
} 
1

, 단지 포인터가

LPWSTR moduleName = {0}; 
GetModuleFileNameEx (GetCurrentProcess(),0,moduleName,_MAX_FNAME); 

를해야 충분하지 않다 : 지금처럼3210
TCHAR moduleName[_MAX_PATH]; 
GetModuleFileNameEx(GetCurrentProcess(), 0, moduleName, _countof(moduleName)); 

을 사용하고 lstrcmpi()을 사용합니다.