Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

95 lines
2.5 KiB

; ========================================================
COMMENT #
FINDSTR.ASM
Copyright (c) 1988 - Microsoft Corp.
All rights reserved.
johnhe - 08/01/89 Initial coding
01/12/89 Converted to LIB form
END COMMENT #
;========================================================
DOSSEG
.MODEL LARGE,C
;========================================================
.CODE
; ========================================================
; FindString( char *Buffer, char *String, unsigned BufferSize );
;
; Quickly searches for a string in a buffer of any type of
; data. The search is case sensitive.
;
; Buffer - The buffer to search
; String - The zero terminated string to search for
; Count - The length of the buffer in bytes
; ========================================================
FindString PROC USES DS ES DI SI, Buffer:DWORD, String:DWORD, Count:WORD
cld
mov CX,Count ; Put length of buffer in CX
or CX,CX ; Make sure length > 0
jnz LoadStrings
jmp SHORT NoMatch
LoadStrings:
lds SI,String ; Pointer to string in DS:SI
les DI,Buffer ; Pointer to buffer in ES:DI
lodsb ; Put first character of string in AL
or AL,AL ; Check for zero length string
jnz FindChar
jmp SHORT NoMatch
FindChar:
repne scasb ; Try to match the first char in the string
jcxz NoMatch ; If CX==0 no matches were found
push AX ; Save setup of the scan so it can be
push DI ; continued if this is not a matching string
push SI
push CX
CmpString:
lodsb ; Get next char in the string
or AL,AL ; See if EOL marker
jnz CheckForMatch ; If not EOL compare the character
pop CX ; If EOL we found a matching string
pop SI ; So restore the register and break the loop
pop DI
pop AX
jmp SHORT FoundMatch
CheckForMatch:
cmp AL,ES:[DI] ; Cmp next char from str. with next in buffer
jne RestoreRegs ; If not equal go back to checking first char
inc DI ; Else point to next char in the buffer
dec CX ; and dec count
jz RestoreRegs ; If CX==0 were at the end of the buffer
jmp SHORT CmpString ; Else cmp the next chars
RestoreRegs:
pop CX ; Restore register setup used by char scan
pop SI
pop DI
pop AX
jmp SHORT FindChar ; Go back to checking for first char match
FoundMatch:
xor AX,AX ; Signal OK (ie: match found)
jmp SHORT FindStringReturn ; Jmp to procedure return
NoMatch:
mov AX,-1 ; Signal no match was found
FindStringReturn:
ret ; Finished
FindString ENDP
; ========================================================
END
; ========================================================