Code:
define PAGE_LINE_SIZE (((sizeof(void*) * 2) * CHAR_BIT) + 7)
intptr_t proc_intptr_next( int *err, proc_handle_t *handle, intptr_t addr, intptr_t *size ) {
char line[PAGE_LINE_SIZE] = {0};
intptr_t from = 0, upto = 0;
if ( !size ) {
if ( err ) *err = EDESTADDRREQ;
return -1;
}
*size = -1;
if ( !handle ) {
if ( err ) *err = EINVAL;
return -1;
}
#ifdef _LARGEFILE64_SOURCE
lseek64( handle->pagesFd, 0, SEEK_SET );
#else
lseek( handle->pagesFd, 0, SEEK_SET );
#endif
next_page:
if ( read( handle->pagesFd, line, PAGE_LINE_SIZE )
!= PAGE_LINE_SIZE ) {
if ( err ) *err = errno;
return -1;
}
line[PAGE_LINE_SIZE-1] = 0;
sscanf( line, "%p-%p", (void**)(&from), (void**)(&upto) );
if ( addr >= upto ) {
while ( read( handle->pagesFd, line, 1 ) != 1 ) {
if ( line[0] == '\n' )
goto next_page;
}
if ( err ) *err = errno;
return -1;
}
*size = upto - from;
return from;
}
node_t proc_aobscan(
int *err, int into,
proc_handle_t *handle,
uchar *array, intptr_t bytes,
intptr_t from, intptr_t upto ) {
node_t count = 0;
uchar buff[BUFSIZ*2] = {0}, *i, *next;
intptr_t done, addr, size, stop;
errno = EXIT_SUCCESS;
if ( into < 0 ) {
if ( err ) *err = EDESTADDRREQ;
return 0;
}
if ( !handle || !array || bytes <= 0 ) {
if ( err ) *err = EINVAL;
return 0;
}
if ( (addr = proc_intptr_next( err, handle, from, &size )) < 0 )
return 0;
stop = addr + size;
if ( addr >= upto ) {
if ( err ) *err = EXIT_SUCCESS;
return 0;
}
if ( from < addr ) from = addr;
#ifdef _LARGEFILE64_SOURCE
if ( lseek64( handle->rdMemFd, from, SEEK_SET ) < 0 ) {
if ( err ) *err = errno;
return 0;
}
if ( lseek64( into, 0, SEEK_SET ) < 0 ) {
if ( err ) *err = errno;
return 0;
}
#else
if ( lseek( handle->rdMemFd, from, SEEK_SET ) < 0 ) {
if ( err ) *err = errno;
return 0;
}
if ( lseek( into, 0, SEEK_SET ) < 0 ) {
if ( err ) *err = errno;
return 0;
}
#endif
done = stop - from;
if ( done >= BUFSIZ ) done = BUFSIZ;
if ( (done = read( handle->rdMemFd, buff, done )) <= 0 ) {
if ( err ) *err = errno;
return 0;
}
next = buff + done;
while ( (from + bytes) < upto ) {
if ( done == BUFSIZ ) {
done = stop - from;
if ( done >= BUFSIZ ) done = BUFSIZ;
if ( (done =
read( handle->rdMemFd, buff + BUFSIZ, done )) <= 0) {
if ( err ) *err = errno;
return count;
}
}
for ( i = buff; i < next; ++i, ++from ) {
if ( memcmp( i, array, bytes ) == 0 ) {
if ( write( into, &from, sizeof(from) ) != sizeof(from) ) {
if ( err ) *err = errno;
return count;
}
++count;
}
}
(void)memmove( buff, buff + BUFSIZ, BUFSIZ );
(void)memset( buff + BUFSIZ, 0, BUFSIZ );
next = buff + done;
if ( from >= stop ) {
if ( (addr = proc_intptr_next(
err, handle, from, &size )) < 0 )
return count;
if ( addr >= upto ) {
if ( err ) *err = EXIT_SUCCESS;
return count;
}
stop = addr + size;
if ( from < addr ) from = addr;
}
}
if ( err ) *err = EXIT_SUCCESS;
return count;
}
And for full file/project: