Проблема с SfcFileException

Тема в разделе "WASM.BEGINNERS", создана пользователем vanilly_cpp, 13 дек 2007.

  1. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Есть код:

    Код (Text):
    1. #include <windows.h>
    2. #include <assert.h>
    3. #include <stdio.h>
    4.  
    5. typedef DWORD (* SFPEXC)(DWORD, PWCHAR , DWORD);
    6.  
    7. void set_debug_privelegis();
    8.  
    9. void main()
    10. {
    11.     set_debug_privelegis();
    12.  
    13.     DWORD result = 0;
    14.     WCHAR szW[100] = L"C:/WINDOWS/Explorer.exe";
    15.    
    16.     SFPEXC sfp_exc;
    17.  
    18.     HMODULE hLib = LoadLibrary("SFC_OS.DLL");
    19.     sfp_exc=(SFPEXC) GetProcAddress(hLib, (char *) 5);
    20.  
    21.     result = sfp_exc(0,szW,-1);
    22.  
    23.     if (result)
    24.         MessageBox(NULL,"err","err",MB_OK);
    25.     else MessageBox(NULL,"success","success",MB_OK);
    26.  
    27.     FreeLibrary(hLib);
    28. }
    29.  
    30.  
    31.  
    32. void set_debug_privelegis()
    33. {
    34.     HANDLE hTokenNew;
    35.     TOKEN_PRIVILEGES tkpNew;
    36.  
    37.     DWORD pid = GetCurrentProcessId();
    38.     HANDLE cur_procc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    39.     if(OpenProcessToken(cur_procc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTokenNew))
    40.     {          
    41.         if( LookupPrivilegeValue(0, "SeDebugPrivilege",&tkpNew.Privileges[0].Luid))
    42.         {
    43.             tkpNew.PrivilegeCount = 1;
    44.             tkpNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    45.  
    46.             if(AdjustTokenPrivileges(hTokenNew,0,&tkpNew,0,0,0))
    47.             {
    48.  
    49.                 printf("priviliges set success");
    50.             }                
    51.         }
    52.         CloseHandle(hTokenNew);
    53.     }
    54.  
    55. }
    и такая проблема:

    При проходе дебагером через строку

    result = sfp_exc(0,szW,-1);

    получаю диалоговое окно с надписью:

    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

    Что посоветуете?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vanilly_cpp
    Код (Text):
    1. ...
    2. typedef DWORD (WINAPI *SFPEXC)(DWORD, PWCHAR , DWORD);  // WINAPI или __stdcall
    3. ...
     
  3. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Спасибо помогло!

    Если не секркт, на что влияет WINAPI или __stdcall?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vanilly_cpp
    Это соглашение вызова. Оно описывает правила вызова и возврата из подпрограмм, т.е. каком порядке и как передаются параметры и кто, вызываемая или вызывающая сторона, отвечает за "выталкивание" параметров из стека при возврате.
    Получи asm-листинг без WINAPI и с ней и обрати внимание на наличие команды add esp,0Ch после result = sfp_exc(0,szW,-1); в первом случае и отсутствие ее во втором случае. Так же посмотри внутрь SFC_OS@5 и обрати внимание, что она завершается retn 0Ch.
     
  5. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Спасибо понял!

    Теперь еще одна проблемка:

    Код (Text):
    1. #include <windows.h>
    2. #include <assert.h>
    3. #include <stdio.h>
    4.  
    5. //#pragma comment(lib,"user32")
    6.  
    7.  
    8.  
    9. typedef DWORD (__stdcall *SFPEXC)(DWORD, PWCHAR , DWORD);
    10.  
    11. void set_debug_privelegis();
    12.  
    13. void main()
    14. {
    15.     set_debug_privelegis();
    16.  
    17.     DWORD result = 0;
    18.     WCHAR szW[100] = L"C:/WINDOWS/system32/drivers/beep.sys";
    19.    
    20.     SFPEXC sfp_exc;
    21.  
    22.     HMODULE hLib = LoadLibrary("SFC_OS.DLL");
    23.     sfp_exc=(SFPEXC) GetProcAddress(hLib, (char *) 5);
    24.  
    25.     result = sfp_exc(0,szW,-1);
    26.  
    27.   /*  if (result)
    28.         MessageBox(NULL,"err","err",MB_OK);
    29.     else MessageBox(NULL,"success","success",MB_OK);*/
    30.  
    31.  
    32.     HANDLE h = CreateFile("C:/WINDOWS/system32/drivers/beep.sys",
    33.                                    GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);          
    34.     assert(h != INVALID_HANDLE_VALUE);
    35.  
    36.     char c[30] = "fuck beep";
    37.     DWORD dw;
    38.  
    39.     assert( WriteFile(h, c, strlen(c), &dw, NULL) );
    40.    
    41.     CloseHandle(h);  
    42.  
    43.     printf("all ok");
    44.  
    45.     FreeLibrary(hLib);
    46. }
    47. void set_debug_privelegis()
    48. {
    49.     HANDLE hTokenNew;
    50.     TOKEN_PRIVILEGES tkpNew;
    51.  
    52.     DWORD pid = GetCurrentProcessId();
    53.     HANDLE cur_procc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    54.     if(OpenProcessToken(cur_procc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTokenNew))
    55.     {          
    56.         if( LookupPrivilegeValue(0, "SeDebugPrivilege",&tkpNew.Privileges[0].Luid))
    57.         {
    58.             tkpNew.PrivilegeCount = 1;
    59.             tkpNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    60.  
    61.             if(AdjustTokenPrivileges(hTokenNew,0,&tkpNew,0,0,0))
    62.             {
    63.                 DWORD err = GetLastError();
    64.                 if(err == ERROR_SUCCESS)
    65.                 {
    66.                     printf("priviliges set success");
    67.                 }
    68.                 else
    69.                 {
    70.                     printf("priviliges no set");
    71.                 }
    72.             }                
    73.         }
    74.         CloseHandle(hTokenNew);
    75.     }
    76.  
    77.  
    78.  
    79. }
    Sfc почему-то не отключатся!
    beep.sys меняелься секунд на 5 и заново востанавливается (

    весь код вроде отрабатывает нормально!

    result = 2 - так и должно быть?

    Где забочил?
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vanilly_cpp
    Где забочил?
    Попробуй так
    Код (Text):
    1. ...
    2. DWORD result = 0;
    3. //WCHAR szW[100] = L"C:/WINDOWS/system32/drivers/beep.sys";
    4. WCHAR szW[100] = L"C:\\WINDOWS\\system32\\drivers\\beep.sys";
    5.  
    6. SFPEXC sfp_exc;
    7. ...
    result = 2 - так и должно быть?
    Afaik ноль - успешное завершение, иначе ошибка.
     
  7. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    непомогло (((((((

    та же борода!

    Все возвращается как было!
     
  8. vanilly_cpp

    vanilly_cpp New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2007
    Сообщения:
    68
    Извеняюсь обшибся )

    при смене / на \\ зацепил S в слове WINDOWS и потому неполучилось

    У видел исправил заработало!

    >>q_q
    большое спасибо!