Articles of winapi

RGB特定控制台文本颜色C ++

我试图将win32控制台应用程序的字体颜色分别设置为特定的RGB值,如50,75,90。 我已经尝试了SetConsoleTextAttribute() ,但不幸的是,对于R,G或B,似乎限制为0或255。 这一定是可能的,因为在命令提示属性窗口中,你可以设置特定的颜色,就像这样 我search了不less,但似乎唯一的答案是SetConsoleTextAttribute() 。

如何执行Windows身份validation?

SQL Server,文件和打印机共享,Exchange以及许多其他应用程序都可以根据用户的Windows标识对用户进行身份validation。 他们如何做到这一点? 特别是,我该怎么做? 作为一个具体的例子,在下面的方法中完成原生Windows代码: Boolean IsCurrentUserValidForDomain(String domainName) { //TODO: Ask Stackoverflow to fill in the code here } 我可以让我们开始: Boolean IsCurrentUserValidForDomain(String domainName) { //Get the security token associated with the thread TOKEN userToken; // Get the calling thread's access token. if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, true, out userToken) { if (GetLastError != ERROR_NO_TOKEN) throw new Exception("Could […]

用于虚拟内存pipe理的新的Windows 8.1 API:`DiscardVirtualMemory()`与`VirtualAlloc()`和`MEM_RESET`和`MEM_RESET_UNDO`

Windows 8.1 / Server 2012RC2刚刚推出了虚拟内存pipe理的新API: OfferVirtualMemory() , ReclaimVirtualMemory() , DiscardVirtualMemory() ,它们的用法非常简单,只需查看它们的名称即可。 我无法得到的是这些API对VirtualAlloc()加上标志MEM_RESET和MEM_RESET_UNDO ,以及这些细微的差别是什么。 对于OfferVirtualMemory() ,MSDN认为它与VirtualAlloc() + MEM_RESET非常相似,不同之处在于它从工作集中删除页面,并限制对页面的进一步访问。 所以,基本上它限制对页面的访问,如果我想再次访问这些页面,我必须调用ReclaimVirtualMemory() ,这很好,但不应该MEM_RESET也从工作集中删除页面? 不应该MEM_RESET作为madvise(2)的POSIX MADV_DONTNEED标志,它基本上从进程的页表中删除页面,如果我将来再次访问这些页面,访问将产生一个软错误,这些页面将再次重新分配,初始化为零。 如果这是真的,那么当然,页面将从进程的工作集中被移除,因为即使进程保持分配的虚拟地址,并且看到它们“提交”,它们也基本上被释放。 现在我们来看看DiscardVirtualMemory() :这里MSDN没有提到MEM_RESET标志,但是如果我读了这个API的描述,它看起来和VirtualAlloc() + MEM_RESET 。 那么,有没有人知道这些API之间是否存在一些差异,以及这些细微差别的恰当用例是什么? 如果他们引入了像DiscardVirtualMemory()这样的新的API,那么与旧的方法应该有一些区别。 如果我想从POSIX移植一个使用madvise(2)与MADV_DONTNEED和MADV_WILLNEED的应用程序,那么模仿这个POSIX行为的最好方法是什么? 到目前为止,我使用了MADV_DONTNEED VirtualAlloc() + MEM_RESET_UNDO和MADV_WILLNEED VirtualAlloc() + MADV_WILLNEED 。 没关系,或者我可以用这些新的API做得更好?

我如何获得每个显示器的尺寸(分辨率)?

我需要帮助如何检索我的屏幕的分辨率,如下图所示。 我发现这个文档 ,这真的很有帮助。 以下是我尝试的代码,基于这些文档: int numberOfScreens = GetSystemMetrics(SM_CMONITORS); int width = GetSystemMetrics(SM_CXSCREEN); int height = GetSystemMetrics(SM_CYSCREEN); std::cout << "Number of monitors: " << numberOfScreens << "\n"; // returns 3 std::cout << "Width:" << width << "\n"; std::cout << "Height:" << height << "\n"; 但是,它只能识别和提供有关主监视器的信息。 我如何获得有关其他显示器的信息?

Winapi:LOGON32_LOGON_INTERACTIVE是否提供受限令牌?

我想了解的是LogonUser与LOGON32_LOGON_INTERACTIVE是否产生受限令牌或不? 这是我的代码: int davai() { FILE * fp; fp = fopen ("C:\\tmp\\davai.txt", "a"); fprintf(fp, "shevedi davai"); fflush(fp); HANDLE token = NULL; HANDLE dupToken = NULL; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &token)) { fprintf(fp, "davai: OpenProcessToken cheijva. %d\n", (int)GetLastError()); fflush(fp); } if (DuplicateTokenEx(token, MAXIMUM_ALLOWED, NULL, SecurityDelegation, TokenPrimary, &dupToken) == 0) { fprintf(fp, "davai: OpenProcessToken DuplicateTokenEx. %d\n", (int)GetLastError()); […]

是否可以将非控制台Win32应用程序附加到调用cmd shell?

当我有一个Win32非控制台应用程序(AFAIK,一个Win32应用程序的控制台链接到exe),从控制台cmd.exe启动它将立即返回到命令提示符,运行应用程序“在后台“(它可以有一个graphics用户界面,甚至打开自己的控制台窗口) 是否有可能在非控制台可执行文件中检测到它是从cmd.exe启动并将其“附加”到启动cmd.exe? 请注意,这里有很多问题/答案,但似乎这个确切的方法还没有被调查。 (也许这是不可能的。)

优雅的方法注入一个DLL进程之前,他们开始

我正在制作一个修改目标进程行为的“mod”dll。 我成功地注入了我的dll并钩住了一些target的函数。 但是当我需要在主模块启动之前(更清楚的是,在入口点之前)钩住一些API时,需要做更多的工作。 我需要用CREATE_SUSPENDED属性手动启动目标程序,注入,然后恢复。 但是一些应用程序从自己的启动程序开始,一些应用程序通常从x64进程开始……这样的各种环境使得自动化很难。 看起来像最好的方式注入DLL的所有进程和处理CreateProcess。 但有时需要UAC,x64的开发。 任何意见,将不胜感激。

RegisterPowerSettingsNotification C#pinvoke

我试图检测笔记本电脑盖打开和closures,应该是真正简单。 我可以正确地注册这个事件,但是当我closures我的笔记本电脑窗口时我没有收到通知。 这里是DLL导入 (DLL代码: http ://www.pinvoke.net/default.aspx/user32/registerpowersettingnotification.html)(GUID_LIDCLOSE_ACTION: http ://social.msdn.microsoft.com/Forums/en-US/tabletandtouch/thread/0bbf90be -9322-47fb-bfa4-016b57211b3a ) [DllImport(@"User32", SetLastError = true, EntryPoint = "RegisterPowerSettingNotification", CallingConvention = CallingConvention.StdCall)] private static extern IntPtr RegisterPowerSettingNotification( IntPtr hRecipient, ref Guid PowerSettingGuid, Int32 Flags); static Guid GUID_LIDCLOSE_ACTION = new Guid(0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3); private const int WM_POWERBROADCAST = 0x0218; private […]

CreateProcess后调用GetModuleFileNameEx时,ERROR_INVALID_HANDLE

在成功调用CreateProcess之后,我试图使用GetModuleFileNameEx(lpApplicationName和lpCommandLine参数可以改变或为null,因此在这种情况下它们不可靠)获取所创build的进程的path。 问题是,GetModuleFileNameEx失败,错误6(ERROR_INVALID_HANDLE),使其缓冲区保留无效数据。 我无法理解的原因,因为CreateProcess成功和进程句柄应该已经正确保存在pi.hProcess。 希望您能提前一点,谢谢! 编辑:更新:我注意到,删除CREATE_SUSPENDED也删除这个问题,但我需要该标志设置。 我能怎么做? // Defining GetModuleFileNameExA function typedef DWORD (WINAPI *fGetModuleFileNameExA) ( HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize ); //Load dinamically DLL function on program startup: fGetModuleFileNameExA _GetModuleFileNameExA = (fGetModuleFileNameExA) GetProcAddress( LoadLibraryA("Psapi.dll"), "GetModuleFileNameExA"); // **** OTHER UNRELATED CODE HERE **** PROCESS_INFORMATION pi; //This call succeeds if (!CreateProcessW( ApplicationName, CommandLine, NewProcess.lpProcessAttributes, […]

所有用户正在运行的应用程序的窗口标题/前景检测

假设应用程序将由Windows上的administrator用户执行; 有没有办法使用Windows API来检索窗口标题,并检测应用程序是否在所有login用户的前台? 尝试下面的代码,我们无法检索其他login用户正在运行的应用程序的标题。 // to get the processes Process[] processlist = Process.GetProcesses(); // and this to get the title: process.MainWindowTitle