experiment : 字符串分解 on drv
来源:互联网 发布:数据库管理系统的发展 编辑:程序博客网 时间:2024/06/13 14:39
需求: 分解字符串, 提取分隔符之间的内容
字符串输入: \\MY-DEV2\MyShareDir\test.txt
分解成3部分: MY-DEV2 + MyShareDir + test.txt
switch(ulCtrlCode) { case IO_CTRL_CODE_UNC_QUERY: DbgPrint("IO_CTRL_CODE_UNC_QUERY\r\n"); sRc = fnUncFileQuery(pInputBuffer, ulinputSize, &UncFileQueryInfo); pIrp->IoStatus.Status = sRc; pIrp->IoStatus.Information = (STATUS_SUCCESS == sRc) ? sizeof(TAG_UNC_FILE_QUERY_INFO) : 0; if (STATUS_SUCCESS == sRc) { if (*pulOutputSize >= sizeof(TAG_UNC_FILE_QUERY_INFO)) { RtlCopyMemory(pOutputBuffer, (PVOID)(&UncFileQueryInfo), sizeof(TAG_UNC_FILE_QUERY_INFO)); } else { pIrp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; pIrp->IoStatus.Information = 0; } } break; default: DbgPrint("Unknown ulCtrlCode\r\n"); pIrp->IoStatus.Status = STATUS_SUCCESS; pIrp->IoStatus.Information = 0; break; }
NTSTATUS fnUncFileQuery(PVOID pcUncPathName, ULONG ulLenUncPathName, TAG_UNC_FILE_QUERY_INFO * pUncFileQueryInfo){ /// ulLenUncPathName 是字节长度 ULONG dwRc = E_SUCCESS; if (PASSIVE_LEVEL != KeGetCurrentIrql()) { DbgPrint("PASSIVE_LEVEL != KeGetCurrentIrql()\r\n"); return KfRaiseIrql(PASSIVE_LEVEL); } if ( (NULL == pcUncPathName) || (NULL == pUncFileQueryInfo) || (ulLenUncPathName <= 0)) { return STATUS_INVALID_PARAMETER; } /// 从UncPathName中取出 主机名, 共享文件夹名称, 剩下的内容(共享文件中的子文件夹+共享文件名称) dwRc = fnParseUncPathName((wchar_t *)pcUncPathName, pUncFileQueryInfo); if (E_SUCCESS != dwRc) { DbgPrint("fnParseUncPathName(%S) = %d\r\n", pcUncPathName, dwRc); return STATUS_INVALID_PARAMETER; } /// 判断主机名是否是本机 /// 判断共享文件夹 是否为本地的共享文件夹 /// 重组UNC文件全路径名 => 实际的文件名, 写入输出参数 return STATUS_SUCCESS;}DWORD fnParseUncPathName(wchar_t * pszUncPathName, TAG_UNC_FILE_QUERY_INFO * pUncFileQueryInfo){ // \\MY-DEV2\MyShareDir\test.txt///< \\主机名称\共享文件夹名称\共享子文件夹\共享文件名称 // \\Localhost\MyShareDir\test.txt///< \\Localhost\共享文件夹名称\共享子文件夹\共享文件名称 // \\192.168.1.60\MyShareDir\test.txt///< \\IP地址\共享文件夹名称\共享子文件夹\共享文件名称 ULONG dwRc = E_SUCCESS; wchar_t * pszFindBegin = NULL; wchar_t * pszFindEnd = NULL; const wchar_t * pszUncFileNameHead = L"\\\\"; ///< UNC 文件名以 L"\\\\" 起头 const wchar_t * pszUncFileNameSeparator = L"\\"; ///< UNC 文件名 元素间的分隔符 if (PASSIVE_LEVEL != KeGetCurrentIrql()) { DbgPrint("PASSIVE_LEVEL != KeGetCurrentIrql()\r\n"); return KfRaiseIrql(PASSIVE_LEVEL); } RtlZeroMemory(pUncFileQueryInfo, sizeof(TAG_UNC_FILE_QUERY_INFO)); DbgPrint("pszUncPathName = %S\r\n", pszUncPathName); RtlCopyMemory(pUncFileQueryInfo->szUncFilePathName, pszUncPathName, wcslen(pszUncPathName) * sizeof(wchar_t)); /// 查找主机名称 pszFindBegin = wcsstr(pUncFileQueryInfo->szUncFilePathName, pszUncFileNameHead); if ((NULL == pszFindBegin) || (pszFindBegin != pUncFileQueryInfo->szUncFilePathName)) ///< 字符串开头就是引导符号 { return E_PARAM; } pszFindBegin += wcslen(pszUncFileNameHead); ///< 指向引导符号后的字符串 pszFindEnd = wcsstr(pszFindBegin, pszUncFileNameSeparator); if (NULL == pszFindEnd) { return E_PARAM; } RtlCopyMemory(pUncFileQueryInfo->szHostName, pszFindBegin, (pszFindEnd - pszFindBegin) * sizeof(wchar_t)); /// 查找共享文件夹名称 pszFindBegin = pszFindEnd + 1; pszFindEnd = wcsstr(pszFindBegin, pszUncFileNameSeparator); if (NULL == pszFindEnd) { return E_PARAM; } RtlCopyMemory(pUncFileQueryInfo->szShareDir, pszFindBegin, (pszFindEnd - pszFindBegin) * sizeof(wchar_t)); /// 查找 共享文件名, 包含子文件夹 pszFindBegin = pszFindEnd + 1; RtlCopyMemory(pUncFileQueryInfo->szShareFileName, pszFindBegin, wcslen(pszFindBegin) * sizeof(wchar_t)); return dwRc;}
- experiment : 字符串分解 on drv
- experiment : thread on drv
- drv experiment : FOLLOW_JMP parse
- experiment : hook on idapython
- MY experiment on MIS
- experiment: tstring字符串查找
- alg : 单向链表逆序 on drv
- alg : 单向链表排序 on drv
- drv experiment : 从内核API代码定位函数地址或结构指针地址
- alg : 单向链表回环的判断 on drv
- experiment: parse crash info on vs2008
- experiment: view ssdt's api on windbg
- experiment : add struct define on IDA6.1
- experiment : judge IRP_MJ_CREATE CreateDisposition on minifilter
- experiment : use Aux Library on R0
- experiment : C mix ASM on x64 r0
- experiment : C mix MASM on x86 r3
- experiment
- 将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete
- 由JTA分布式事务Timeout值引发的锁定及解决
- 反射
- java logging--java记录日志
- JavaScript事件冒泡简介及应用
- experiment : 字符串分解 on drv
- struct类型的赋值
- Hadooop sites
- Wax框架简明教程(1) 简介
- 设计模式之迭代器模式java实现代码
- Windows 下安装并配置 SVN 服务器全过程
- java基本概念(二)
- 提炼数据 数据处理
- 如何规范.net中的js开发(1)概念篇(更新版)