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
相关产品推荐
相关产品推荐

