Articles of winapi

Win32 API来判断给定的二进制文件(EXE或DLL)是x86,x64还是ia64

我试图find一个编程方式来判断一个二进制文件是x86,x64还是ia64。 平台:Windows。 语言:c / c ++。 背景:在尝试加载第三方DLL之前,我需要找出它的位。 欣赏任何指针。

是否有一个Vista的API来检测桌面是否全屏运行?

例如,用户正在全屏播放电影,还是在全屏模式下查看幻灯片? 我可以发誓之前,我看到一个IsFullScreenInteractive API,但现在找不到它

如何以编程方式将控制台字体设置为Raster Font?

在运行时,如何确保命令提示符的当前字体是默认的光栅字体? 我正在使用C ++与WinApi。 现在我已经使用GetConsoleFontEx(); 和SetConsoleFontEx(); ,但我一直无法findCONSOLE_FONT_INFOEX的FaceName属性的正确值。 我在网上find了一些字体设置为Lucida和/或Consolas的例子,但那不是我要找的。 这是我现在的代码片段: COORD fs = {8, 8}; CONSOLE_FONT_INFOEX cfie = {0}; cfie.cbSize = sizeof(cfie); GetCurrentConsoleFontEx(hOut, 0, &cfie); char fn[] = "Raster"; // Not really doing anything strcpy_s((char*)cfie.FaceName, 32, fn); // Not sure if this is right cfie.dwFontSize.X = fs.X; cfie.dwFontSize.Y = fs.Y; SetCurrentConsoleFontEx(hOut, 0, &cfie); 我testing了SetCurrentConsoleFontEx()的返回值,它是非零的,表示调用成功。 虽然字体不会改变。

有没有办法通过Python 3最小化Windows 7中的窗口?

我正在运行一个内置Python解释器的程序。 定期我希望该程序能够“全屏”或最小化。 这将在Windows 7上运行。 我想知道是否有办法在Python中做到这一点(以便我可以从我的程序中调用该函数)。 只使用标准库是理想的,但是如果有一种方法可以用外部模块来完成,那也可以。 谢谢。

AttachConsole的最低版本要求是什么?

在线PSDK文档状态5.1(WinXP): 要编译使用此函数的应用程序,请将_WIN32_WINNT定义为0x0501或更高版本。 有关更多信息,请参阅使用Windows头。 要求 最低支持的客户端 :Windows XP [仅限桌面应用] 最低支持的服务器 :Windows Server 2003 [仅适用于桌面应用程序] 老版本的PSDK doc与上面的模糊不清,并试图说明5.0(Win2k)或5.1: 要编译使用此函数的应用程序,请将_WIN32_WINNT定义为0x0500或更高版本。 有关更多信息,请参阅使用SDK头。 要求 客户端:需要Windows Vista或Windows XP。 服务器:需要Windows Server“Longhorn”或Windows Server 2003。 最后,PSDK标题(相当老)也主张Win2k: #if(_WIN32_WINNT >= 0x0500) WINBASEAPI BOOL WINAPI AttachConsole( __in DWORD dwProcessId); #define ATTACH_PARENT_PROCESS ((DWORD)-1) #endif /* _WIN32_WINNT >= 0x0500 */ 我没有任何比WinXP SP3更老的东西来检查kernel32.dll导出目录,所以请赐教我什么是真正的最低支持的版本, 5.0或5.1 ?

无限的Windows消息循环

我在我的程序中有这个消息循环: while (true) { if (PeekMessage(&msg, window, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { MessageBox(NULL, L"Quit", L"", 0); break; } TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); } } 这个循环不会结束。 即使主窗口消失,它也不会显示消息框。 这是WndProc代码: switch (msg) { case WM_CLOSE : DestroyWindow(hwnd); break; case WM_DESTROY : PostQuitMessage(0); break; default : return DefWindowProc(hwnd, msg, wParam, lParam); break; } […]

Windows应用程序中的窗口消息,无窗口

我有一个应用程序,我想在后台运行没有可见的窗口或控制台。 要做到这一点,我创build一个Windows应用程序,但我不创build一个窗口。 当请求closures时(即,当用户注销时),应用程序需要做一些清理。 我怎样才能确定什么时候结束? 我可以简单地创build一个处理WM_CLOSE消息的消息循环吗? 但是,我没有WndProc来处理WM_CLOSE消息。

内核模式下的线程本地存储?

是否有与Windows中的内核模式驱动程序等效的线程本地存储(TLS)(准确地说是Win32)? 我试图实现的是: 最后从我的驱动程序的调度例程中,它可能会调用许多其他function(可能有一个深层的调用堆栈)。 我想提供一些特定于正在处理的请求的上下文信息。 也就是说,我有一些结构,指针应该在所有被调用的函数中可见,而不必将其作为参数明确地传递给每个函数。 使用静态/全局不是一个完美的select(multithreading,同步对象等)。 如果这是一个用户模式的代码 – 在这种情况下显然会使用TLS。 但是AFAIK没有像TlsGetValue / TlsSetValue这样的内核模式函数。 这是有道理的 – 对于那些需要工作的函数,必须先分配一个进程范围的TLS索引。 OTOH驱动程序代码可以在任意线程上调用,而不限于特定的进程。 但是,我实际上并不需要一个持久的线程特定的存储。 我只需要一个特定于线程的存储,用于我的顶级函数调用。 我想我知道如何“实施”红绿灯系统,虽然是一种骇人听闻的方式。 我将永远使用预定义的索引(比如index = 0),而不是分配TLS索引。 在顶层函数中,我将保存存储的TLS值,并用所需值覆盖它。 完成后保存的值将被恢复。 幸运的是我知道如何在Win32中实现TLS。 每个线程都有一个TIB结构(线程信息块)。 在每个线程中可以使用FS:[18h]select器访问。 TIB包含(除其他之外)由TLS使用的数组。 其余的很简单。 不过,我宁愿使用官方的API来实现类似的东西。 有一个官方的内核模式API来实现我所需要的吗? 有没有理由避免我打算做的事情? 我知道再入口可能存在问题(例如,某些代码调用了我,我覆盖了TLS值,最终调用了可能依赖于TLS的原始代码)。 但是在我的具体情况下这是不可能的? 有没有更less的肮脏方法来解决这个问题 提前致谢。 PS One理论上可以使用SEH(也存储了每个线程的信息)。 也就是说, __try/__except用__try/__except包装顶级代码__try/__except ,还需要在需要上下文信息的地方使用一些参数来引发可继续的exception,在__except块中用上下文信息填充参数,然后恢复执行。 这是一个100%有效的程序stream程,不使用未logging的function。 但是,这对我来说似乎是一个丑陋的黑客,更不用说性能的复杂性了。

从DllMain调用LoadLibrary

MSDN说: 它不能调用LoadLibrary或LoadLibraryEx函数(或调用这些函数的函数),因为这可能会在DLL加载顺序中创build依赖关系循环。 这可能会导致在系统执行初始化代码之前使用DLL。 我试图从DllMain调用LoadLibrary并没有发生任何事情。 我看到的唯一问题是,在我的DllMain执行之前,加载的DLL将在我的DLL中使用函数。 为什么我不能在DllMain中调用LoadLibrary? 编辑: 好吧,我意识到,我不能仅仅因为我必须相信其他信徒所做的MSDN(我在那里看到一些错误的东西,但我也应该忘记它们),所以我不能在DllMain中调用LoadLibrary。 而且因为在Windows的新版本中可能会发生一些事情(虽然过去十年没有任何改变)。 但是,任何人都可以显示一个代码,将重现一些不好的事情,当在DllMain中调用LoadLibrary时会发生什么? 在任何现有的Windows操作系统? 不只是在另一个单独的初始化函数调用,但LoadLibrary在DllMain?

在Windows中,如何创buildsubprocess并捕获其stdin,stdout和stderr,而不复制任何可inheritance的句柄?

这个问题至less有三个部分,所以请耐心等待: 1)CreateProcess有一个参数bInheritHandles,它使subprocessinheritance父进程中的所有可inheritance的句柄。 此选项必须设置为TRUE以允许父级为STARTUPINFO参数中的子级指定stdin,stdout和stderr句柄。 2)在Win32中,当有多个句柄对同一文件打开时,删除和重命名文件可能会失败。 3)Microsoft CRT的open()函数默认会创build可inheritance的句柄。 此外,默认情况下创build的文件句柄受到上述问题2的困扰。 这个神奇的组合创build了以下操作问题:库A调用open(),并且不希望后续的重命名和删除失败。 在另一个过程中,另一个库B正在调用CreateProcess,将bInheritHandles设置为TRUE(捕获stdin / out / err),临时创build重复句柄。 现在偶尔库A的文件操作失败。 自然,图书馆A和B由不同的人维护。 我也知道另一个使用open()的库A',并遭受类似的问题。 这篇文章讨论了一个相关的问题和解决scheme。 但是,它仍然依赖于在父进程中将bInheritHandles设置为TRUE来调用CreateProcess,所以它不能解决这个问题。 我想知道如果别人有这个问题,如果没有一个众所周知的解决scheme? 上面的kb文章基本上意味着调用CreateProcess与bInheritHandles设置为TRUE是活泼的,所以我的意图是修复库B,使它从来没有这样做。 我会这样做: 创build一个暂停的中间过程(理想情况下,通过使用rundll在库B中运行自定义入口点),并将bInheritHandles设置为FALSE。 创buildstdin / out / errpipe道,并将这些pipe道的正确结尾复制到中间进程。 以某种方式将被欺骗的手柄传递给中间过程。 恢复中间过程。 从中间过程填充STARTUPINFO与来自父级的pipe道,并调用CreateProcess与bInheritHandles设置为TRUE。 这是一个好策略还是有一些更好的解决scheme? 你会如何推荐将步骤手柄交给步骤3中的中间过程? Rundll +自定义入口点是在步骤1中设置中间过程的可靠方法吗?