/* 文件名snwscanf.C 缘故: 系统中格式化字符串的函数不少,如: 2: kd> x nt!*Printf* fffff800`04dd1fa4 nt!vsnwprintf (<no parameter info>) fffff800`04dbe0e8 nt!RtlStringCbPrintfA (<no parameter info>) fffff800`04c96890 nt!RtlStringCbVPrintfA (<no parameter info>) fffff800`04dd746c nt!snwprintf_s (<no parameter info>) fffff800`04dd20b0 nt!vsnprintf_l (<no parameter info>) fffff800`04ec3e04 nt!StringCchPrintfExW (<no parameter info>) fffff800`04dd36f4 nt!sprintf (<no parameter info>) fffff800`04dd4164 nt!vsprintf_l (<no parameter info>) fffff800`04dd7ddc nt!sprintf_s (<no parameter info>) fffff800`04dd2098 nt!vsnprintf (<no parameter info>) fffff800`04dd7380 nt!snprintf_s (<no parameter info>) fffff800`04dd6c70 nt!vswprintf_s (<no parameter info>) fffff800`04dd1fbc nt!vsnwprintf_l (<no parameter info>) fffff800`04dd748c nt!vsnwprintf_s (<no parameter info>) fffff800`04c9cf54 nt!RtlStringCbPrintfW (<no parameter info>) fffff800`04d83d80 nt!StringCchPrintfW (<no parameter info>) fffff800`04f867e8 nt!g_AslLogPfnVPrintf = <no type information> fffff800`04d7e268 nt!RtlStringCbPrintfExW (<no parameter info>) fffff800`04dd29e0 nt!swprintf (<no parameter info>) fffff800`04dd29e0 nt!swprintf (<no parameter info>) fffff800`04dd6750 nt!get_printf_count_output (<no parameter info>) fffff800`04dd24d0 nt!snprintf (<no parameter info>) fffff800`05352008 nt!AslLogCallPrintf (<no parameter info>) fffff800`04dd2578 nt!snwprintf (<no parameter info>) fffff800`04dd6c50 nt!swprintf_s (<no parameter info>) fffff800`04dd2aa0 nt!vswprintf_l (<no parameter info>) fffff800`04dd2a94 nt!vswprintf (<no parameter info>) fffff800`04dbfdcc nt!RtlUnicodeStringPrintf (<no parameter info>) fffff800`04dd41dc nt!vsprintf (<no parameter info>) fffff800`04dd73a0 nt!vsnprintf_s (<no parameter info>) fffff800`04e5eba0 nt!RtlUnicodeStringPrintfEx (<no parameter info>) fffff800`04dd7dfc nt!vsprintf_s (<no parameter info>) fffff800`04d331b0 nt!RtlStringCchPrintfExW (<no parameter info>) fffff800`04e41a80 nt!RtlStringCbPrintfExA (<no parameter info>) fffff800`04dbfc5c nt!RtlStringCchPrintfA (<no parameter info>) fffff800`04d8ca18 nt!RtlStringCchPrintfW (<no parameter info>) WRK中也有不少,不信,你看代码。 凡是反过来,就没有,如:WRK中没有,XP和2003中没有。 还好vista开始有了,不信,你看: 2: kd> x nt!*scanf* fffff800`04dd7434 nt!snscanf_s (<no parameter info>) fffff800`04dd7e44 nt!sscanf_s (<no parameter info>) fffff800`04dd8298 nt!swscanf_s (<no parameter info>) fffff800`04dd752c nt!snwscanf_s (<no parameter info>) 有此足矣! stdio.h中尽管有_snwscanf_s的定义/声明,但是没有实现,不信,你编译下: error LNK2019: 无法解析的外部符号 _snwscanf_s,该符号在函数 XXX 中被引用。 但是,这不是难事,不信,你看本文的实现办法。 参考: https://msdn.microsoft.com/zh-cn/library/dktz45bk.aspx made by correy made at 2017.03.31 homepage:http://correy.webs.com */ #include <ntifs.h> //#include <ntddk.h> //这两个次序不能乱(乱会出错的),有上面的,这个可以注释掉。 #include <windef.h> #include <stdio.h> #define tag 'tset' //test #pragma warning(disable:4100) //未引用的形参 #pragma warning(disable:4214) //整形以外的位域类型 #pragma warning(disable:4121) //封装要区分成员对齐方式 #pragma warning(disable:4189) //局部变量已初始化但不引用 #pragma warning(disable:4101) //未引用的局部变量 #pragma warning(disable:4201) //使用了非标准扩展 : 无名称的结构/联合 #pragma warning(disable:4055) // //typedef OBJECT_TYPE * (*ObGetObjectType)(IN PVOID pObject); typedef int (__cdecl * SNWSCANF_S)(//snwscanf_s const wchar_t * input, size_t length, const wchar_t * format, ... ); SNWSCANF_S g_snwscanf_s; DRIVER_UNLOAD Unload; VOID Unload(__in PDRIVER_OBJECT DriverObject) { NTSTATUS status = STATUS_UNSUCCESSFUL; } DRIVER_INITIALIZE DriverEntry; NTSTATUS DriverEntry(__in struct _DRIVER_OBJECT * DriverObject, __in PUNICODE_STRING RegistryPath) { NTSTATUS status = STATUS_UNSUCCESSFUL; UNICODE_STRING test; KdBreakPoint(); DriverObject->DriverUnload = Unload; RtlInitUnicodeString( &test, L"_snwscanf_s" ); g_snwscanf_s = (SNWSCANF_S)MmGetSystemRoutineAddress(&test);//注意:赋值的类型转换。 if (g_snwscanf_s) { wchar_t input[] = L"999999999"; int number = 0; int i = g_snwscanf_s(input, wcslen(input) * sizeof(wchar_t), L"%d", &number); ASSERT(i); } return status; }
2017年6月2日星期五
snwscanf
订阅:
博文评论 (Atom)
没有评论:
发表评论