Есть код: Код (Text): #include <windows.h> #include <assert.h> #include <stdio.h> typedef DWORD (* SFPEXC)(DWORD, PWCHAR , DWORD); void set_debug_privelegis(); void main() { set_debug_privelegis(); DWORD result = 0; WCHAR szW[100] = L"C:/WINDOWS/Explorer.exe"; SFPEXC sfp_exc; HMODULE hLib = LoadLibrary("SFC_OS.DLL"); sfp_exc=(SFPEXC) GetProcAddress(hLib, (char *) 5); result = sfp_exc(0,szW,-1); if (result) MessageBox(NULL,"err","err",MB_OK); else MessageBox(NULL,"success","success",MB_OK); FreeLibrary(hLib); } void set_debug_privelegis() { HANDLE hTokenNew; TOKEN_PRIVILEGES tkpNew; DWORD pid = GetCurrentProcessId(); HANDLE cur_procc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if(OpenProcessToken(cur_procc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTokenNew)) { if( LookupPrivilegeValue(0, "SeDebugPrivilege",&tkpNew.Privileges[0].Luid)) { tkpNew.PrivilegeCount = 1; tkpNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(AdjustTokenPrivileges(hTokenNew,0,&tkpNew,0,0,0)) { printf("priviliges set success"); } } CloseHandle(hTokenNew); } } и такая проблема: При проходе дебагером через строку 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. Что посоветуете?
vanilly_cpp Код (Text): ... typedef DWORD (WINAPI *SFPEXC)(DWORD, PWCHAR , DWORD); // WINAPI или __stdcall ...
vanilly_cpp Это соглашение вызова. Оно описывает правила вызова и возврата из подпрограмм, т.е. каком порядке и как передаются параметры и кто, вызываемая или вызывающая сторона, отвечает за "выталкивание" параметров из стека при возврате. Получи asm-листинг без WINAPI и с ней и обрати внимание на наличие команды add esp,0Ch после result = sfp_exc(0,szW,-1); в первом случае и отсутствие ее во втором случае. Так же посмотри внутрь SFC_OS@5 и обрати внимание, что она завершается retn 0Ch.
Спасибо понял! Теперь еще одна проблемка: Код (Text): #include <windows.h> #include <assert.h> #include <stdio.h> //#pragma comment(lib,"user32") typedef DWORD (__stdcall *SFPEXC)(DWORD, PWCHAR , DWORD); void set_debug_privelegis(); void main() { set_debug_privelegis(); DWORD result = 0; WCHAR szW[100] = L"C:/WINDOWS/system32/drivers/beep.sys"; SFPEXC sfp_exc; HMODULE hLib = LoadLibrary("SFC_OS.DLL"); sfp_exc=(SFPEXC) GetProcAddress(hLib, (char *) 5); result = sfp_exc(0,szW,-1); /* if (result) MessageBox(NULL,"err","err",MB_OK); else MessageBox(NULL,"success","success",MB_OK);*/ HANDLE h = CreateFile("C:/WINDOWS/system32/drivers/beep.sys", GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL); assert(h != INVALID_HANDLE_VALUE); char c[30] = "fuck beep"; DWORD dw; assert( WriteFile(h, c, strlen(c), &dw, NULL) ); CloseHandle(h); printf("all ok"); FreeLibrary(hLib); } void set_debug_privelegis() { HANDLE hTokenNew; TOKEN_PRIVILEGES tkpNew; DWORD pid = GetCurrentProcessId(); HANDLE cur_procc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if(OpenProcessToken(cur_procc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTokenNew)) { if( LookupPrivilegeValue(0, "SeDebugPrivilege",&tkpNew.Privileges[0].Luid)) { tkpNew.PrivilegeCount = 1; tkpNew.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if(AdjustTokenPrivileges(hTokenNew,0,&tkpNew,0,0,0)) { DWORD err = GetLastError(); if(err == ERROR_SUCCESS) { printf("priviliges set success"); } else { printf("priviliges no set"); } } } CloseHandle(hTokenNew); } } Sfc почему-то не отключатся! beep.sys меняелься секунд на 5 и заново востанавливается ( весь код вроде отрабатывает нормально! result = 2 - так и должно быть? Где забочил?
vanilly_cpp Где забочил? Попробуй так Код (Text): ... DWORD result = 0; //WCHAR szW[100] = L"C:/WINDOWS/system32/drivers/beep.sys"; WCHAR szW[100] = L"C:\\WINDOWS\\system32\\drivers\\beep.sys"; SFPEXC sfp_exc; ... result = 2 - так и должно быть? Afaik ноль - успешное завершение, иначе ошибка.
Извеняюсь обшибся ) при смене / на \\ зацепил S в слове WINDOWS и потому неполучилось У видел исправил заработало! >>q_q большое спасибо!