我正在尝试使用MoveFile(LPCWSTR existing,LPCWSTR new)函数.我希望能够通过连接不同的数据(例如:根目录和潜在的文件名)来实现其中一个目录(由LPCWSTR表示).尽管经过了数小时的研究,我还是想不出怎么做.感谢任何帮助.
QueryDosDevice(L"E:", DeviceName, MAX_PATH);
Run Code Online (Sandbox Code Playgroud)
(E:是SD卡)
DeviceName是"\ Device\HarddiskVolume3"
如何将其"转换"为类似的东西 "\\.\PHYSICALDRIVE1"
是否有可能哄骗std :: atomic输出CMPXCHG16B用于我对在Windows x64上使用原子互锁操作不感兴趣的类型,或者我只需要吸收它并手动执行原子操作?我可以让GCC/Clang在Linux上这样做,所以我怀疑它只是微软标准库的一个问题.
struct Byte16
{
int64_t a, b;
};
std::atomic<Byte16> atm;
Byte16 a = { 1, 2 };
atm.compare_exchange_strong(...); // This has a lock on Windows, not on Linux version of code
Run Code Online (Sandbox Code Playgroud) 当进程以低完整性级别运行时,您无法写入%temp%,因此我需要一种方法来查找%temp%\ Low目录的路径(不使用"低"字硬编码)
我想在 Windows 程序和功能中显示我的自定义图标。我已经通过 NSIS 创建了一个安装程序脚本 下面是我的 MUI 用户界面设置
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON ".\Include\Images\Icons\icon.ico"
!define MUI_UNICON ".\Include\Images\Icons\icon.ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP ".\Include\Images\Header\header.bmp"
!define MUI_HEADERIMAGE_UNBITMAP ".\Include\Images\Header\header.bmp"
!define MUI_HEADERIMAGE_RIGHT
!define MUI_WELCOMEFINISHPAGE_BITMAP ".\Include\Images\Wizard\welcome.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP ".\Include\Images\Wizard\welcome.bmp"
Run Code Online (Sandbox Code Playgroud) 我正在尝试从提升的进程创建中或低完整性进程。我知道还有其他类似的问题,但它们主要关注使用资源管理器或任务计划程序等解决方法,我想坚持使用CreateRestrictedToken()+ CreateProcessAsUser()。
我认为一定可以以某种方式执行此操作,因为我相信 UAC 在您登录时会执行此操作,但我无法使令牌中的所有内容看起来像正常的 UAC Medium IL 令牌。
通过创建令牌CreateRestrictedToken(hThisProcessToken, LUA_TOKEN, ...),然后设置TokenOwner,TokenDefaultDacl然后TokenIntegrityLevel调用 之前,您可以获得 80% 的收益CreateProcessAsUser()。
剩下的问题是TokenVirtualizationAllowed、TokenVirtualizationEnabled、TokenElevation、TokenElevationType和TokenMandatoryPolicy其中SetTokenInformation()失败并出现 ERROR_PRIVILEGE_NOT_HELD 或 ERROR_INVALID_PARAMETER。
如果我以 SYSTEM @ SECURITY_MANDATORY_SYSTEM_RID 身份运行并启用所有权限,而不是以管理员 @ SECURITY_MANDATORY_HIGH_RID 身份运行,那么我可以进行设置TokenMandatoryPolicy,TokenVirtualization*但设置TokenElevation*仍然失败!(目前仅在 Windows 8 上进行了测试)
TokenElevation*令牌中没有正确的值是一个大问题,因为 Internet Explorer 无法在保护模式下启动,因为它认为令牌已提升。
的文档没有SetTokenInformation()说明TOKEN_INFORMATION_CLASS可以设置哪些项目以及需要哪些权限(如果有),我不明白为什么不允许您将这些设置为与实际完整性级别()匹配的较低安全TokenIntegrityLevel值令牌。
使用Safer API创建SAFER_LEVELID_NORMALUSER令牌并不能解决任何这些问题,而且还会创建比普通 …
将 /TSAWARE 链接器标志添加到我的一个项目 (Visual Studio 6) 后,我惊讶地发现 PE 文件 (.idata) 中有一个新部分。如果我不设置标志,导入将合并到 .rdata 中。
为了说明“问题”,我们从一个简单的控制台程序开始:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并编译: cl /Og /O1 /GF /WX /c main.c
然后链接
link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.objlink /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj让我们比较 dumpbin 输出:
Dump of file a.exe
File Type: EXECUTABLE IMAGE
Summary
4000 .data
1000 .rdata
5000 .text
Dump of file b.exe
File Type: EXECUTABLE IMAGE
Summary
4000 .data
1000 .idata
1000 .rdata
5000 …Run Code Online (Sandbox Code Playgroud) 我在WM_DRAWITEM中完成绘画后, Windows 似乎绘制了子菜单箭头,如何阻止 Windows 绘制箭头?
我想在安装后立即运行我的应用程序,我了解执行此操作的代码如下:
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
!insertmacro MUI_PAGE_FINISH
Section
CreateShortcut "$DESKTOP\HelloWorldShortcut.lnk" "$INSTDIR\Hello World.exe" "dev03 3"
SectionEnd
Function LaunchLink
ExecShell "" "$DESKTOP\HelloWorldShortcut.lnk"
FunctionEnd
Run Code Online (Sandbox Code Playgroud)
问题是我的安装程序是静默安装程序,但上面的代码向其中添加了一个页面。
有没有办法使用静默安装程序在安装后立即运行应用程序?
我需要ShellExecute作为另一个用户的东西,目前我开始使用CreateProcessAsUser该调用的辅助进程ShellExecute,但这似乎太多的黑客(错误的父进程等)有没有更好的方法来做到这一点?
@PabloG:ImpersonateLoggedOnUser不起作用:
HANDLE hTok;
VERIFY(LogonUser("otheruser",0,"password",LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hTok));
VERIFY(ImpersonateLoggedOnUser(hTok));
ShellExecute(0,0,"calc.exe",0,0,SW_SHOW);
RevertToSelf();
CloseHandle(hTok);
将以登录用户开始计算,而不是"其他用户"
@ 1800信息:CreateProcess/ 与Vista上的UAC CreateProcessAsUser不一样ShellExecute,CreateProcess当你无法控制用户正在执行的程序时,它是无用的(CreateProcess如果你给它一个带有标记为清单的清单的exe文件,则会返回错误requireAdmin)
@Brian R. Bondy:我已经知道这个信息(并且不要误解我的好东西),但这是关于主题(恕我直言)我要求的ShellExecuteAsUser,不是关于作为另一个用户启动进程,我已经知道了怎么做.
Function Check32or64BitWindows
${If} ${RunningX64}
strcpy $INSTDIR "$PROGRAMFILES64\${APP_FULL_PATH}"
SetRegView 64
${Else}
SetRegView 32
strcpy $INSTDIR "$PROGRAMFILES32\${APP_FULL_PATH}"
${EndIf}
FunctionEnd
Run Code Online (Sandbox Code Playgroud)
如果检测到旧版本,则执行
ExecWait '"$INSTDIR\uninst.exe" /S' $0
Run Code Online (Sandbox Code Playgroud)
我的卸载部分:
Section uninstall
!define APP_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_VENDOR} ${APP_NAME}"
!define APP_UNINST_ROOT_KEY "HKLM"
DeleteRegKey ${APP_UNINST_ROOT_KEY} "${APP_UNINST_KEY}"
SectionEnd
Run Code Online (Sandbox Code Playgroud)
Section -Post
WriteRegStr ${APP_UNINST_ROOT_KEY} "${APP_UNINST_KEY}" "DisplayName" "${APP_FULL_NAME}"
SectionEnd
Run Code Online (Sandbox Code Playgroud)
Post部分在Windows 64位注册表视图中创建注册表项,但卸载程序不会删除注册表项.
如果我删除了对64位操作系统的检查,那么在Wow6432Node中创建和删除注册表就可以正常工作.
如果我在具有CSIDL_PROGRAM_FILESx86文件夹ID而不是CSIDL_PROGRAM_FILES ID的32位系统中使用SHGetFolderPath api调用会发生什么?
理论上CSIDL_PROGRAM_FILESx86应映射到C:\program files (x86)64位系统,但它在32位系统中映射到什么路径不存在?
标题有这一切,在设置程序使用的类路径时,.:构造的意义是什么?
考虑
/Library/Java/Home/bin/java -cp $APP_HOME/lib/*.jar:: Handler
Run Code Online (Sandbox Code Playgroud)
VS
/Library/Java/Home/bin/java -cp .:$APP_HOME/lib/*.jar:: Handler
Run Code Online (Sandbox Code Playgroud)