You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access violation问题排查:测试程序调用_snwprintf_s报错

解决PasswordFilter DLL中_snwprintf_s访问违例(PUNICODE_STRING参数触发)

核心问题分析

0xC0000005访问违例(读取0xFFFFFFFFFFFFFFFF)本质是传入了无效指针或非法内存地址。结合你硬编码参数正常、PUNICODE_STRING触发报错的现象,问题大概率出在对Windows UNICODE_STRING 结构体的处理上——这个结构体包含Length(字节数)、MaximumLength(字节数)、Buffer(宽字符指针)三个字段,任何一个字段不合法都会导致内存访问错误。

可能的原因及解决方法

1. PUNICODE_STRING参数本身无效

排查点:

  • 系统传递给PasswordChangeNotify的UNICODE_STRING可能是临时只读内存,若你尝试修改或后续访问时内存已被回收,会触发报错;
  • 测试程序构造UNICODE_STRING时,Buffer未指向合法宽字符数组,或Length/MaximumLength与Buffer实际长度不匹配;
  • Length字段为奇数(UNICODE字符串每个字符占2字节,Length必须是偶数)。

解决:

在调用_snwprintf_s前强制校验参数合法性:

if (!unicodeStr || !unicodeStr->Buffer || (unicodeStr->Length % 2 != 0) || (unicodeStr->Length > unicodeStr->MaximumLength)) {
    // 直接返回错误或记录日志,避免非法访问
    return FALSE;
}

测试程序构造UNICODE_STRING时要严格遵循规范:

wchar_t testUser[] = L"test_user";
UNICODE_STRING usrStr;
usrStr.Buffer = testUser;
usrStr.Length = wcslen(testUser) * sizeof(wchar_t); // 字节数,不是字符数
usrStr.MaximumLength = sizeof(testUser); // 包含终止符的总字节数

2. _snwprintf_s缓冲区大小或格式化参数错误

排查点:

  • 把字节数当成了宽字符数量传递给_snwprintf_s的第二个参数(该参数要求是宽字符的个数);
  • 直接用%s格式化未以\0结尾的UNICODE_STRING->Buffer(Windows的UNICODE_STRING通常不含终止符,会导致函数读取越界)。

解决:

  • 正确计算缓冲区的宽字符数量:
wchar_t cmdBuf[2048];
// 使用_countof获取数组的宽字符个数,动态分配则用 bufSize/sizeof(wchar_t)
_snwprintf_s(cmdBuf, _countof(cmdBuf), L"powershell.exe -Command \"Sync-Password -User %.*s\"", 
             unicodeStr->Length / sizeof(wchar_t), // 指定字符数,避免越界
             unicodeStr->Buffer);
  • 用%.*s格式符指定读取长度,避免依赖\0终止符:
    其中*对应后面的字符数参数(unicodeStr->Length / sizeof(wchar_t)),确保只读取UNICODE_STRING实际包含的字符。

3. DLL调试替代方案

针对DLL无法直接调试的问题,可通过写日志文件定位参数问题:

FILE* logFile = fopen("C:\\temp\\pwd_filter.log", "a");
if (logFile) {
    fwprintf(logFile, L"[DEBUG] UserStr Length: %u, MaxLength: %u, BufferAddr: %p\n", 
             unicodeStr->Length, unicodeStr->MaximumLength, unicodeStr->Buffer);
    if (unicodeStr->Buffer) {
        fwprintf(logFile, L"[DEBUG] Buffer Content: %.*s\n", 
                 unicodeStr->Length / sizeof(wchar_t), unicodeStr->Buffer);
    }
    fclose(logFile);
}

通过日志可直观看到传入的UNICODE_STRING参数是否合法,快速定位内存访问问题。

内容的提问来源于stack exchange,提问作者Ryan London

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:37:07