驅動中如下代碼,有時候會在wcsstr行藍屏
if (wcsstr(file_obj->FileName.Buffer,L"abc.db"))
{
DbgPrint("open abc.db/n");
}
其中file_obj->FileName爲Unicode_String類型,經分析,應該是FileName.Buffer並非以0結尾的字符串。所以改用自己實現的以下替代函數
#include "wchar.h"
//search string's substring
//str: Buffer to search from
//nLength: the character length of str
//returns a pointer to the first occurrence of strSearch in str.
//
char* __stdcall FindSubStringA(const char *str,int nLength,const char *strSearch)
{
char *cp=(char *)str;
char *s1, *s2;
if(!*strSearch)
return ((char *)str);
while(nLength && *cp )
{
s1 = cp;
s2 = (char*)strSearch;
while(*s1 && *s2 && !(*s1-*s2))
s1++, s2++;
if(!*s2)
return(cp);
cp++;
nLength--;
}
return (NULL);
}
wchar_t* __stdcall FindSubStringW(const wchar_t *str,int nLength,const wchar_t *strSearch)
{
wchar_t *cp=(wchar_t *)str;
wchar_t *s1, *s2;
if(!*strSearch)
return ((wchar_t *)str);
while(nLength && *cp )
{
s1 = cp;
s2 = (wchar_t*)strSearch;
while(*s1 && *s2 && !(*s1-*s2))
s1++, s2++;
if(!*s2)
return(cp);
cp++;
nLength--;
}
return(NULL);
}
代碼改成如下後,藍屏不再出現。
if (FindSubString(file_obj->FileName.Buffer,file_obj->FileName.Length/2,L"abc.db"))
{
DbgPrint("open abc.db/n");
}