Tag: winapi

重新启动Windows进程,保留进程ID和句柄

我创建了一个Windows可执行文件,作为某些嵌入式设备的模拟器(所有业务逻辑与原始设备完全相同,只有硬件相关的东西是存根的)。 此模拟需要不时重置,在“正常”用例中,它会执行以下操作: //some global environment … int main(int argc, char* argv[]) { __debugbreak(); //… do some stuff //if( restart needed ){ printf(“before _execv”); _execv(argv[0], argv); //”reset” simulated device //} //… do some other testing stuff return 0; } 注意:上面的代码仅用于说明主要思想,在实际应用中, execv调用实际上位于HW_Reset()存根中,即从原始代码中的多个位置调用。 问题是Windows上的_execv在Linux上的行为与execv完全不同:当我在Visual Studio中调试此应用程序时, _execv不会用“重新启动”的图像替换当前的过程映像。 相反,它只是创建一个带有新ID的新进程并终止当前进程,导致将其从Visual Studio中分离出来,因此,要保留我需要一次又一次地重新连接到该新进程的所有断点(在单个调试会话中有几十次重新启动) )。 目前我使用__debugbreak()作为解决方法。 其他选项是通过重新初始化全局环境并使用setjmp / longjmp的某种组合来重置模拟 – 但是全局环境和相应的初始化程序通过原始文件的thousends传播,并且大多数是静态的,因此无法手动处理此类重置(我也不允许编辑原始文件)。 所以问题是:是否有一些Windows API /通用解决方法通过重置所有全局(和静态)变量导致当前进程“就地”重新启动,例如,如果可以在同一地址内重新加载相同的进程映像空间,保留向外可观察的进程ID,进程句柄和与visual […]

code :: blocks出现奇怪的编译错误

我昨天从Visual Studio切换到Code :: Blocks,只是有一些奇怪的编译器错误消息。 我包含了windows.h,我可以使用所有API调用,例如创建窗口类和创建窗口/按钮和东西。 但是当我尝试使用SendInput()发送一些按键时,我收到了关于这两个声明的错误消息: INPUT ip; KEYBDINPUT kbi; 编译器错误: C:\code_blocks\test-app\main.cpp|21|error: ‘INPUT’ was not declared in this scope| C:\code_blocks\test-app\main.cpp|22|error: ‘KEYBDINPUT’ was not declared in this scope| 我甚至可以右键单击KEYBDINPUT和INPUT并单击“查找声明”,它在“winuser.h”(在里面)中找到它,但它仍然给我这些错误消息,它们未被声明。 此代码在VS中正常工作,只包含windows.h。 我正在使用GNU GCC编译器。

如何使用WriteConsoleInput / WriteConsole将Return / Enter字符发送到控制台

我有以下代码。 我想发送命令“uci”,然后将Return / Enter发送到控制台。 但是,我没有成功。 请劝告。 谢谢! #include #include #include DWORD WINAPI test(LPVOID lp) { system(“edit”); return 0; } int main(int argc, char* argv[]) { /* HANDLE hConIn = CreateFile(“CONIN$”, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); HANDLE hConOut = CreateFile(“CONOUT$”, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); */ HANDLE hConIn = GetStdHandle(STD_INPUT_HANDLE); […]

如何获取活动窗口的名称?

我遇到了获取活动窗口名称的问题。 当我使用这段代码时: HWND currentWindowHWND = GetForegroundWindow(); char title[100]; GetWindowTextA(currentWindowHWND, title, 100); 我得到的结论是:“如何获得活动窗口的名称? – Stack Overflow – Google Chrome”。 但是我想获得“Google Chrome”,我应该使用哪种WINAPIfunction?

使用Windows API获取所有Windows启动过程的最佳方法是什么?

我知道我需要查看启动文件夹和某些注册表项。 但是如何使用Windows API呢? 我很想知道Windows XP和Vista。 谢谢你的时间。

尝试编写通过WinAPI录制和播放声音的函数

我正在尝试在C中创建2个函数: 一个录制麦克风X秒 获得录音并播放给用户的录音 这就是我写的: #include #include using namespace std; #pragma comment(lib, “winmm.lib”) WAVEHDR StartRecord(int seconds) { const int NUMPTS = 44100 * seconds; int sampleRate = 44100; short int *waveIn = new short int[NUMPTS]; HWAVEIN hWaveIn; WAVEHDR WaveInHdr; MMRESULT result; WAVEFORMATEX pFormat; pFormat.wFormatTag = WAVE_FORMAT_PCM; pFormat.nChannels = 1; pFormat.nSamplesPerSec = sampleRate; pFormat.nAvgBytesPerSec = 2 * […]

将“\\?\”字符串添加到路径 – DriverPackageUninstall

我使用DriverPackageUninstall来卸载我的驱动程序。 对于这个API,我需要输入“Inf Path”作为输入。 我需要将此路径作为UNICODE字符串。 为此,我从MSDN中获取以下声明作为参考。 对于Unicode字符串,最大长度为32,767个字符。 如果使用Unicode版本,请在路径前添加“\?\”字符串。 有关文件路径字符串格式的一般信息,请参阅在MSDN Library中命名文件。 但是当我在我的代码中尝试相同时它不起作用。 有人可以给我一些关于如何在路径之前添加“\?\”的示例吗? 谢谢.. 更新: 我尝试使用以下代码作为示例 #define UNICODE #define _UNIOCDE #define WINVER 0x501 #include #include #include int main () { PTCHAR DriverPackageInfPath = TEXT(“\\?\\c:\\Documents and Settings\\Desktop\\My.inf”); FILE * Log; Log = _wfopen( TEXT(DriverPackageInfPath, TEXT(“a”)); if ( Log == NULL ) { MessageBox(NULL, TEXT ( “Unable to open […]

如何向ListView添加蓝色选择矩形?

Windows API ListView是否支持此选择矩形?

如何从超时的Windows命名管道读取?

我试图在Unix中将一些非常容易的东西移植到Windows:当没有任何事情发生时,从超时读取命名管道(fifo)。 我试图以一种简单的方式(使用PeekNamedPipe ),而不使用重叠的IO。 这可能吗? 以下是一个完整的例子。 它暂时不起作用:没有收到书面字符串,读者也会收到 ERROR_NO_DATA 232(0xE8)管道正在关闭 在第一次阅读之后,作者在经过一些尝试后得到了这个 ERROR_SEM_TIMEOUT 121(0x79)信号量超时期限已过期 测试编写器(管道客户端): #include “Windows.h” #include #include #include int main() { HANDLE hpipe; DWORD written; const char *pname = “\\\\.\\pipe\\isp-control”; char msg[] = “play asdf.wav”; printf(“waiting for pipe %s\n”, pname); bool stat = WaitNamedPipeA(pname, 4000); printf(” –> %d, error %d\n”, stat, GetLastError()); if (stat) { hpipe […]

如何在一个WinAPI挂钩中创建一个Hook和Trampolinefunction

所以我一直在学习钩子和使用trampolines的概念,以绕过/执行WinAPI钩子函数中的数据(在不同的可执行文件中,使用DLL注入)。 到目前为止,我知道如何使用程序集和C的混合物来制作它(蹦床和钩子),但我似乎不能只使用C来做,因为我似乎缺少一些东西。 如果有人能告诉我我做错了什么以及如何修复它,我会很感激。 现在我的代码: #include unsigned char* address = 0; __declspec(naked) int __stdcall MessageBoxAHookTrampoline(HWND Window, char* Message, char* Title, int Type) { __asm { push ebp mov ebp, esp mov eax, address add eax, 5 jmp eax } } int __stdcall MessageBoxAHook(HWND Window, char* Message, char* Title, int Type) { wchar_t* WMessage = L”Hooked!”; wchar_t* […]