or modify it for wild cards by changingWhile pTarget[i] = pPattern[j] Do
While (pTarget[i] = pPattern[j]) or (pPattern[j] = '*') Do
(*
ByerMore Search Pattern Coded By Departure
*)
Function SearchPattern(Const pTarget, pPattern: PChar): DWORD;
Var
i :Integer;
j :Integer;
k :Integer;
iTargetLen :Integer;
iPatternLen :Integer;
baStep: Array[0..255] Of Byte;
Begin
Result := 0;
iTargetLen := Length(pTarget);
iPatternLen := Length(pPattern);
If iTargetLen * iPatternLen = 0 Then Exit;
FillChar(baStep,SizeOf(baStep), iPatternLen);
For K := 0 to iPatternLen -1 do baStep[Ord(pPattern[k])]:= iPatternLen - K;
While K <= iTargetLen Do
Begin
i := k - 1;
j := iPatternLen - 1;
While pTarget[i] = pPattern[j] Do
Begin
Dec(i);
Dec(j);
End;
If j = -1 Then
Begin
Result := i + 2;
Exit;
End;
Inc(K, baStep[Ord(pTarget[k])]);
End;
End;

#include <cstring>
unsigned long SearchPattern(const char* pTarget,const char* pPattern)
{
int i,j,k,iTargetLen,iPatternLen;
unsigned char baStep[255];
unsigned long result = 0;
iTargetLen = strlen(pTarget);
iPatternLen = strlen(pPattern);
if( iTargetLen*iPatternLen == 0) return result;
for(int i = 0 ; i < iPatternLen; i++) baStep[i] = sizeof(baStep);
for(k=0; k<iPatternLen; k++) baStep[(int)pPattern[k]] = iPatternLen - k;
while(k<=iTargetLen){
i=k-1;
j=iPatternLen-1;
while((pTarget[i] == pPattern[j]) || (pPattern[j] == '*')){
i--;
j--;
}
if(j=(-1))
{
result = i+2;
return result;
}
k+=baStep[((int)pTarget[k])];
}
}
#define realAddy( cast, base, offset ) (cast)((DWORD)(base) + (DWORD)(offset))
bool bExist(BYTE part, BYTE *whole, char *mask)
{
BYTE *start = (BYTE*)(whole + sizeof(whole) - 1);
for(DWORD loc = 0; loc < sizeof(whole); loc++)
if((*(BYTE*)(start - loc) == part) || (*(mask + (strlen(mask) - 1) - loc) == '?')) return true;
return false;
}
DWORD lastLocationOfByte(BYTE part, BYTE *whole, char *mask)
{
BYTE *start = (BYTE*)(whole + sizeof(whole) - 1);
for(DWORD loc = 0; loc < sizeof(whole); loc++)
if((*(BYTE*)(start - loc) == part) || (*(mask + (strlen(mask) - 1) - loc) == '?')) return (sizeof(whole) - loc);
}
DWORD FindPattern(DWORD first, DWORD total, BYTE *val, char *mask)
{
size_t next = sizeof(*val);
BYTE *addy = (BYTE*)((val + next) - 1);
bool exist = false;
BYTE *loc;
for(DWORD n = (next - 1); n < total;)
{
DWORD spot;
for(spot = 0; (*(unsigned char*)(first + n - spot) == *(unsigned char*)(addy - spot)) || (*(mask + (strlen(mask) - 1) - spot) == '?'); spot++);
if(spot == next) return realAddy( DWORD, first, n );
else if(bExist(*(BYTE*)(first + n), val, mask))
n += lastLocationOfByte(*(BYTE*)(first + n), val, mask);
else n += next;
}
return false;
}
DWORD SearchPattern(LPCWSTR szTarget, LPCWSTR szPattern)
{
int i, j, k;
int iTargetLen, iPatternLen;
char baStep[255];
iTargetLen = _***len(szTarget); // (The *** is t-c-s without the -s, no fucking idea why it's *'d out...
iPatternLen = _***len(szPattern); // Same here.
if(iTargetLen * iPatternLen == 0)
return -1;
memset(baStep, iPatternLen, sizeof(baStep));
for(k = 0; k < iPatternLen; k++)
{
baStep[(int)szPattern[k]] = iPatternLen - k;
}
while(k <= iTargetLen)
{
i = k - 1;
j = iPatternLen - 1;
while(szTarget[i] == szPattern[j] || szPattern[j] == '*')
{
i--;
j--;
}
if(j == -1)
return i + 2;
k += baStep[(int)(szTarget[k])];
}
}