在非托管的Win32世界中,我习惯使用CreateWaitableTimer API 创建的等待计时器,可以用于WaitForSingleObject等同步调用,主要用于WaitForMultipleObjects.
在.NET和C#中必须有一个模拟等待计时器?
我一直在使用以下代码(取自KB323809文章)来检索有关可执行文件上的代码签名的信息.这适用于单个数字签名.
但是如何检索多个代码签名的信息?
在这种情况下,下面的Microsoft代码只是为第一个签名重新获取信息.
我的想法是调用CryptMsgGetParam与CMSG_SIGNER_COUNT_PARAM得到签名的数量,然后将每个签名指标传递给后续调用CryptMsgGetParam与CMSG_SIGNER_INFO_PARAM(下面的代码中).但是,这种方法始终在这个返回1周的签名,即使我显然有更多的,像3例:
#include <windows.h>
#include <wincrypt.h>
#include <wintrust.h>
#include <stdio.h>
#include <tchar.h>
#pragma comment(lib, "crypt32.lib")
#define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)
typedef struct {
LPWSTR lpszProgramName;
LPWSTR lpszPublisherLink;
LPWSTR lpszMoreInfoLink;
} SPROG_PUBLISHERINFO, *PSPROG_PUBLISHERINFO;
BOOL GetProgAndPublisherInfo(PCMSG_SIGNER_INFO pSignerInfo,
PSPROG_PUBLISHERINFO Info);
BOOL GetDateOfTimeStamp(PCMSG_SIGNER_INFO pSignerInfo, SYSTEMTIME *st);
BOOL PrintCertificateInfo(PCCERT_CONTEXT pCertContext);
BOOL GetTimeStampSignerInfo(PCMSG_SIGNER_INFO pSignerInfo,
PCMSG_SIGNER_INFO *pCounterSignerInfo);
int _tmain(int argc, TCHAR *argv[])
{
WCHAR szFileName[MAX_PATH];
HCERTSTORE hStore = NULL;
HCRYPTMSG hMsg = NULL;
PCCERT_CONTEXT pCertContext …Run Code Online (Sandbox Code Playgroud) 我正在尝试遵循Microsoft文档,以解除MAX_PATHWindows 10下API中文件路径的限制。它说:
您还可以通过清单来为每个应用启用新的长路径行为:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<ws2:longPathAware>true</ws2:longPathAware>
</windowsSettings>
</application>
Run Code Online (Sandbox Code Playgroud)
所以,第一个问题。是否可以在Visual Studio 2017的项目属性中启用它?
第二个问题:我没有在上面找到答案,所以我决定走一条手工路线:
我这样创建了additional.manifest文本文件:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<ws2:longPathAware>true</ws2:longPathAware>
</windowsSettings>
</application>
</assembly>
Run Code Online (Sandbox Code Playgroud)然后,将其添加到项目属性中:
1> additional.manifest:清单创作警告81010002:名称空间“ http://schemas.microsoft.com/SMI/2016/WindowsSettings ”中无法识别的元素“ longPathAware ”。
那我在做什么错?
c++ manifest long-filenames visual-studio visual-studio-2017
抱歉,如果这个问题太广泛了。我试图了解SetProcessMitigationPolicyWindows 10 中的 function 到底有什么作用,但我在网上找不到太多关于它的信息(除了我之前涉足这个主题之外)。我正在PROCESS_MITIGATION_POLICY一一测试它的选项,并且我有一些关于这些的问题:
ProcessSystemCallDisablePolicy声明它“禁用在最低层使用 NTUser/GDI 函数的能力。 ”。所以我正在这样测试它:
PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY pmscdp = {0};
pmscdp.DisallowWin32kSystemCalls = 1;
BOOL bR = ::SetProcessMitigationPolicy(ProcessSystemCallDisablePolicy, &pmscdp, sizeof(pmscdp));
int err = ::GetLastError();
::GdiFlush(); //Try to trip it here
Run Code Online (Sandbox Code Playgroud)
但它总是失败并显示错误代码 19 或ERROR_WRITE_PROTECT。
那么它到底应该做什么以及如何设置呢?
ProcessExtensionPointDisablePolicy声明它“ ...阻止遗留扩展点 DLL 加载到进程中。 ”
PROCESS_MITIGATION_EXTENSION_POINT_DISABLE_POLICY pmepdp = {0};
pmepdp.DisableExtensionPoints = 1;
BOOL bR = ::SetProcessMitigationPolicy(ProcessExtensionPointDisablePolicy, &pmepdp, sizeof(pmepdp));
int err = ::GetLastError();
Run Code Online (Sandbox Code Playgroud)
抱歉我的天真,但是那是什么extension point DLL?我该如何测试呢?
ProcessSignaturePolicy声明它可以“将图像加载限制为由 Microsoft、Windows 应用商店或 Microsoft、Windows 应用商店和 Windows …
我正在将我的网站从安装在共享网络托管帐户(在 DreamHost)上的 PHP v.5 转换为在 PHP 7.3.11 上运行。转换后,我开始注意到偶尔会收到以下警告:
警告:preg_match_all():JIT 内存分配失败,PCRE JIT 将被禁用。这可能是由安全限制引起的。要么授予 PHP 分配可执行内存的权限,要么设置 pcre.jit=0
最后一个源自这行代码,它应该替换我为页面发布的 HTML 中的特殊标签:
if(preg_match_all("/\[".$tagBegin."(\S)+\]/U", $html, $matches, PREG_OFFSET_CAPTURE) !== false)
Run Code Online (Sandbox Code Playgroud)
我需要在 v.7.3 中做一些不同的事情来避免该警告吗?
我一直在EnterCriticalSection对 Windows 10 上的函数进行逆向工程,发现了这个有趣的自旋循环:
它是这样的:
lbl_loop:
mov ecx, [rsp+60h]
mov ecx, [rsp+60h]
mov ecx, [rsp+60h]
pause
mov ecx, [rsp+60h]
inc ecx
mov [rsp+60h], ecx
cmp ecx, eax
jb lbl_loop
Run Code Online (Sandbox Code Playgroud)
[rsp+60h]所以我的问题是 -循环读取 4 次然后写回的目的是什么?
为什么他们不能这样做:
lbl_loop:
pause
inc ecx
cmp ecx, eax
jb lbl_loop
mov [rsp+60h], ecx
Run Code Online (Sandbox Code Playgroud)
附言。请注意,这是 Windows 10 的生产版本。其余功能EnterCriticalSection均已优化。所以这不是调试版本。
2013年的夏令时(美国)于3月10日星期日凌晨2:00开始.因此,现在是2013年3月9日,我在已创建的等待计时器句柄上调用以下API:
FILETIME ftWhen = //Points as absolute time to March 10th, 2013, at 2:10 AM
SetWaitableTimer(hTimer, ftWhen, 0, NULL, NULL, TRUE);
Run Code Online (Sandbox Code Playgroud)
March 10th, 2013, 2:10 AM 是一个不存在的时间,因为时间将提前一小时调整,而不是凌晨2点,它将是凌晨3点.
所以我的问题是,我的计时器会发生什么?(我似乎无法找到此案例的文档.)
我不断寻找这个问题的不同答案。有些人说它使标记与旧版 Web 浏览器不兼容 - 并引用 Netscape :) 因此,我想重新表述今天(2014 年)的问题,如果我删除标签中的空格,例如是否会对<br />Web 浏览器产生影响?
我不确定我做错了什么,但是Windows Script Host如果我将它保存在.js带有UTF-8编码的文件中,我似乎无法运行以下JScript :
var name = "Hello world!";
WScript.echo(name);
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它给了我这个错误:

请注意,如果我使用ANSI编码保存脚本,脚本运行正常.
是Windows Script Host引擎不兼容的UTF-8编码?
我一直在运行具有长文件名的DLL.例如两个:"api-ms-win-appmodel-runtime-l1-1-1.dll"或"api-ms-win-appmodel-identity-l1-2-0.dll".显然,微软称他们为" 伞库 ".
我最初的理解是它们只是带有新文件名的新DLL,但后来我尝试搜索这些文件.好吧,我找不到它们作为磁盘上的物理文件......
所以我很好奇,它们是否是磁盘上不存在的某种虚拟DLL文件名?
WCHAR buff[MAX_PATH];
buff[0] = 0;
GetSystemDirectory(buff, MAX_PATH);
StringCchCat(buff, MAX_PATH, L"\\api-ms-win-appmodel-runtime-l1-1-1.dll");
HMODULE hModule = LoadLibrary(buff);
//'hModule' is NULL & error code is ERROR_MOD_NOT_FOUND
Run Code Online (Sandbox Code Playgroud)
但以下工作:
HMODULE hModule = LoadLibrary(L"api-ms-win-appmodel-runtime-l1-1-1.dll");
Run Code Online (Sandbox Code Playgroud)