Passa al contenuto principale

SysMemFind, memory find

Questa funzione cerca il pattern di byte definito in Needle nel buffer di memoria definita in Haystack, la ricerca è effettuata in base alla definizione di Mode. Se il pattern è trovato viene ritornato il puntatore all'indirizzo di Haystack dove si trova.

In base alla definizione di Mode può essere ritornato l'indirizzo del primo byte coincidente oppure l'indirizzo del byte successivo all'ultimo byte coincidente. Se pattern non trovato o errore viene ritornato eNULL.

Descrizione​

Immagine F SysMemFind

ParametroTipoDescrizione
HaystackPVOIDPointer al buffer di memoria dove effettuare la ricerca.
HSizeUDINTDimensione del buffer di memoria.
NeedlePVOIDPointer alla stringa da ricercare.
NSizeUDINTDimensione del pattern da ricercare.
ModeFIND_MODEDefinizione modo in cui effettuare la ricerca (Vedi definizione). La funzione ritorna un (PVOID) indirizzo di Haystack dove Needle è stata trovata, eNULL se non trovata.

Esempi​

Come utilizzare gli esempi.
Viene eseguita la ricerca del pattern 16#04, 16#05, 16#06 nel buffer di memoria definito in Mem con diversi modi di ricerca. Dal pointer ritornato viene sottratto l'indirizzo di allocazione di Mem in modo da ottenere la posizione relativa del pattern nel buffer di memoria. Vediamo i vari risultati.

  • Position[0]: 3, La ricerca parte dall'inizio e ritorna la posizione di inizio della prima occorrenza.

  • Position[1]: 6, La ricerca parte dall'inizio e ritorna la posizione successiva alla fine della prima occorrenza.

  • Position[2]: 3, La ricerca parte dalla fine e ritorna la posizione di inizio della prima occorrenza.

  • Position[3]: 6, La ricerca parte dalla fine e ritorna la posizione successiva alla fine della prima occorrenza.

LogicLab (Ptp116, ST_SysMemFind)
PROGRAM ST_SysMemFind
VAR
Position : ARRAY[0..3] OF USINT; (* Found position *)
Mem : ARRAY[0..15] OF BYTE := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; (* Source string *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysMemFind"
// *****************************************************************************
// Some find examples easier to understand.
// -----------------------------------------------------------------------------

Position[0]:=TO_USINT(SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_DEFAULT)-ADR(Mem));
Position[1]:=TO_USINT(SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_GET_END)-ADR(Mem));
Position[2]:=TO_USINT(SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_FROM_END)-ADR(Mem));
Position[3]:=TO_USINT(SysMemFind(ADR(Mem), SIZEOF(Mem), ADR('$04$05$06'), 3, FIND_FROM_END OR FIND_GET_END)-ADR(Mem));

// [End of file]