Prototype
E_RTN EMemory::BlockFind( ulonglong *pullOffsetFound,
void *pBlockToFind,
ulonglong ullBlockToFindSize,
ulonglong ullOffset = 0,
ulonglong ullOffsetSize = EMemory::SizeUpToEnd );

Cette fonction cherche dans l'intervalle de travail un bloc d'octets ayant les valeurs de pBlockToFind.

 

Argument

ulonglong *pullOffsetFound

adresse d'une variable de type ulonglong où sera stocké l'offset du bloc d'octets trouvé.

Si le bloc d'octets n'a pas été trouvé et si cet argument n'est pas NULL alors la valeur EMemory::DataNotFound y est copiée (*pullOffsetFound = EMemory::DataNotFound).

Si cette information ne vous intéresse pas cet argument peut être NULL (la fonction ne retournera pas d'erreur à ce propos).

void *pBlockToFind

adresse du bloc d'octets à chercher.

ulonglong ullBlockToFindSize

taille du bloc d'octets à chercher.

ulonglong ullOffset = 0

offset de départ de l'intervalle de travail de recherche.

ulonglong ullOffsetSize = EMemory::SizeUpToEnd

étendue de l'intervalle de travail de recherche.

 

Retour

E_RTN

voir la section retour de la librairie Eclat.

 

Exemple 1

Description :

Recherche et affichage d'offset de tous les blocs d'octets ayant pour valeurs contigues 0x42, 0x43 et 0x42 ("BCB" en ASCII) dans un objet EMemory alloué de 14 octets d'espace de travail contenant les données 0x42, 0x43, 0x42, 0x43, 0x42, 0x43, 0x42, 0x43, 0x42, 0x43, 0x42, 0x43, 0x42 et 0x43 ("BCBCBCBCBCBCBC" en ASCII).

Code :

EMemory eMem( "BCBCBCBCBCBCBC", 14 ); // objet EMemory alloué de 14 octets
ulonglong ullOffsetStart = 0;
ulonglong ullOffsetFound = 0;

eMem.TraceEx( _T("eMem") );

while ( eOk( eMem.BlockFind( &ullOffsetFound, "BCB", 3, ullOffsetStart ) ) && ullOffsetFound != EMemory::DataNotFound )
  {
  ETrace::DoEx( _T("Bloc \"BCB\" trouvé à l'offset %I64u.\n"), ullOffsetFound );
  ullOffsetStart = ullOffsetFound + 3;
  }

Sortie :

### Object EMemory 'eMem' Trace #
# Object address='0x0012F458', status='EMemory::ObjectStatus_Enable' (code '3').
# Buffer address='0x00000001', workspace size='14' byte(s).
# Array data from offset '0x00000000' to offset '0x0000000D', length=14 byte(s).
# Offset start 0x00000000 42 43 42 43 42 43 42 43 42 43 42 43 42 43 .. .. BCBCBCBCBCBCBC
### End #

Bloc "BCB" trouvé à l'offset 0.
Bloc "BCB" trouvé à l'offset 4.
Bloc "BCB" trouvé à l'offset 8.

Vue :

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E ..
  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D
  42
B
43
C
42
B
43
C
42
B
43
C
42
B
43
C
42
B
43
C
42
B
43
C
42
B
43
C

 

Exemple 2

Description :

Cet exemple est un peu plus complexe que le précédente. Il fait la même chose mais avec un intervalle de travail qui s'étand de l'offset 1 sur une taille de 12 octets (un surcroît de code est nécessaire pour ajuster la taille de recherche).

Code :

EMemory eMem( "BCBCBCBCBCBCBC", 14 ); // objet EMemory alloué de 14 octets
ulonglong ullOffsetStart = 1;
ulonglong ullOffsetSize = 12;
ulonglong ullOffsetFound = 0;

eMem.TraceEx( _T("eMem") );

while ( eOk( eMem.BlockFind( &ullOffsetFound, "BCB", 3, ullOffsetStart, ullOffsetSize ) ) && ullOffsetFound != EMemory::DataNotFound )
  {
  ETrace::DoEx( _T("Bloc \"BCB\" trouvé à l'offset %I64u.\n"), ullOffsetFound );
  ullOffsetSize -= ullOffsetFound + 3 - ullOffsetStart;
  ullOffsetStart = ullOffsetFound + 3;
  }

Sortie :

### Object EMemory 'eMem' Trace #
# Object address='0x0012F410', status='EMemory::ObjectStatus_Enable' (code '3').
# Buffer address='0x00000001', workspace size='14' byte(s).
# Array data from offset '0x00000000' to offset '0x0000000D', length=14 byte(s).
# Offset start 0x00000000 42 43 42 43 42 43 42 43 42 43 42 43 42 43 .. .. BCBCBCBCBCBCBC
### End #

Bloc "BCB" trouvé à l'offset 2.
Bloc "BCB" trouvé à l'offset 6.
Bloc "BCB" trouvé à l'offset 10.

Vue :

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E ..
  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D
  42
B
43
C
42
B
43
C
42
B
43
C
42
B
43
C
42
B
43
C
42
B
43
C
42
B
43
C

 

Voir aussi
E_RTN EMemory::ByteFind( ulonglong *pullOffsetFound, uchar ucByteToFind, ulonglong ullOffset = 0, ulonglong ullOffsetSize = EMemory::SizeUpToEnd );
E_RTN EMemory::BytesFind( ulonglong *pullOffsetFound, uchar *pucByteFound, void *pBytesToFind, ulonglong ullBytesToFindSize, ulonglong ullOffset = 0, ulonglong ullOffsetSize = EMemory::SizeUpToEnd );
E_RTN EMemory::BlocksFind( ulonglong *pullOffsetFound, ulonglong *pullBlockIdxFound, EMemory::SC_BLOCK *pscBlockToFind, ulonglong ullBlockToFindCount, ulonglong ullOffset = 0, ulonglong ullOffsetSize = EMemory::SizeUpToEnd );

 

Minimum
Version 1.0.0