Tag: windows vista

使用Vista UAC的CreateDesktop()(C Windows)

我正在使用CreateDesktop()来创建一个临时桌面,其中应用程序将运行,执行清理操作(同时保持不受影响)并终止。 一旦应用程序消失,我就关闭了桌面。 使用Windows XP甚至Vista时,一切都很好。 启用(恼人的)UAC时会出现问题。 创建桌面时一切正常,但是当您调用CreateProcess()在该桌面上打开程序时,它会导致打开的应用程序崩溃,User32.dll上出现exception。 我一直在阅读很多关于Windows上不同桌面和图层以及内存限制的内容。 但是,我打开的大多数程序(作为测试场景)都可以,但是一些程序(如IE,Notepad,Calc和我自己的应用程序)会导致崩溃。 任何人都知道为什么会在使用UAC的Vista上发生这种情况,或者更具体地针对这些特定程序? 以及如何解决这个问题? 任何人都有一个很好的例子来说明如何创建一个桌面并在那里打开一个应用程序,而无需在Vista下使用UAC切换到它? 代码表示赞赏。 谢谢 编辑:这是我正在使用的代码。 //Security SECURITY_ATTRIBUTES sa; HDESK dOld; HDESK dNew; BOOL switchdesk, switchdesk2, closedesk; int AppPid; sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); //Get handle to current desktop dOld = OpenDesktopA(“default”, 0, TRUE, DESKTOP_SWITCHDESKTOP| DESKTOP_WRITEOBJECTS| DESKTOP_READOBJECTS| DESKTOP_ENUMERATE| DESKTOP_CREATEWINDOW| DESKTOP_CREATEMENU); if(!dOld) { printf(“Failed […]

C中的内存分配

我有一个关于内存分配顺序的问题。 在下面的代码中,我在循环中分配4个字符串。 但是当我打印地址时,他们似乎并没有一个接一个地分配……我做错了什么,或者是OS实施的某种防御机制,以防止可能的缓冲区溢出? (我使用的是Windows Vista)。 谢谢。 char **stringArr; int size=4, i; stringArr=(char**)malloc(size*sizeof(char*)); for (i=0; i<size; i++) stringArr[i]=(char*)malloc(10*sizeof(char)); strcpy(stringArr[0], "abcdefgh"); strcpy(stringArr[1], "good-luck"); strcpy(stringArr[2], "mully"); strcpy(stringArr[3], "stam"); for (i=0; i<size; i++) { printf("%s\n", stringArr[i]); printf("%d %u\n\n", &(stringArr[i]), stringArr[i]); } 输出: abcdefgh 9650064 9650128 祝你好运9650068 9638624 mully 9650072 9638680 stam 9650076 9638736

我可以在用户模式下获得Vista和Windows 7下的原始磁盘扇区的写入权限吗?

来自RawDisk网站 : Windows Vista的新安全模型严格限制在用户模式下执行的应用程序。 即使具有提升的管理权限,应用程序也无法获得对原始磁盘扇区的写入权限。 这是真的? 来自Microsoft doc : 如果未装入卷或卷没有文件系统 ,则对文件系统和存储堆栈的更改 不适用 。 请给 要么是官方Microsoft文档的链接,要么确认RawDisk网站 或者一个有效的代码示例。 (如果设置了GENERIC_WRITE ,我显然无法创建一个, CreateFile()调用失败, ERROR_ACCESS_DENIED 。) 到目前为止我发现的其他相关Microsoft文档: 阻止对卷和磁盘的直接写入操作 SL_FORCE_DIRECT_WRITE处的SL_FORCE_DIRECT_WRITE SL_FORCE_DIRECT_WRITE处的SL_FORCE_DIRECT_WRITE 结构

使用CryptUnprotectData解密WEP wlan配置文件密钥

我正在尝试使用CryptUnprotectData解密WEP配置文件的密钥。 我获取配置文件密钥的方法是使用netsh导出配置文件。 netsh wlan export profile name=”MyWEP” folder=”./” 现在,我手动将密钥材料从netsh命令生成的.xml文件复制到我的程序。 顺便说一下,我正在解密的是 – DATA_BLOB DataOut, DataVerify; DataOut.cbData = encryptData.length(); DataOut.pbData = (BYTE*)(“I_Manually_Copy_The_WEP_Key_Here”); if (CryptUnprotectData( &DataOut, NULL, NULL, NULL, NULL, 0, &DataVerify)) { printf(“The decrypted data is: %s\n”, DataVerify.pbData); } else { printf(“Failed. Error Code: %d”, GetLastError()); } 但我收到错误代码13引用无效数据。 我究竟做错了什么 ? 在Win 7及更高版本中,我可以直接使用WlanGetProfile和参数WLAN_PROFILE_GET_PLAINTEXT_KEY 。 但我在Vista上没有选择使用CryptUnprotectData函数。 我在 这里看过类似的post,但是没有得到太多有用的信息。 此外,我使用相同的系统具有相同的用户登录凭据。 […]

如何在服务和用户进程之间共享内存?

我有一组Win32应用程序,它们使用CreateFileMapping()和MapViewOfFile()创建的共享内存段共享信息。 其中一个应用是系统服务; 其余部分由登录用户启动。 在Windows XP上,没有问题。 我们将我们的片段命名为“Global \ Something”,一切都很好。 Vista中的额外安全性(以及假设的Windows 7)似乎阻止了这种架构的运行。 不允许普通用户在全局命名空间中创建(Win32错误5)对象。 MSDN表明,如果该帐户具有“创建全局”权限,那么一切都应该很好,但实际上似乎并非如此。 此外,Vista的“完整性”function似乎可以防止“低完整性”用户进程访问“高完整性”服务创建的共享内存对象。 看起来我应该可以通过一些神奇的SetSecurityDescriptorSacl()咒语解决这个问题,但是我很难学会说出来。 所以问题是: 在服务和普通用户进程之间使用共享内存段的正确方法是什么? 为了抢占“刚刚关闭UAC”的简单回答,我们处于一个相当封锁的环境中,这是不可能的。 编辑:服务和用户进程都需要对段进行读/写访问。