ntdll: Fill range of output in fill_working_set_info().

This commit is contained in:
Paul Gofman 2024-06-20 14:47:53 -06:00 committed by Alexandre Julliard
parent 27b74d8e37
commit 76ffdde095

View file

@ -5177,16 +5177,22 @@ static void free_fill_working_set_info_data( struct fill_working_set_info_data *
}
static void fill_working_set_info( struct fill_working_set_info_data *d, struct file_view *view, BYTE vprot,
MEMORY_WORKING_SET_EX_INFORMATION *p )
struct working_set_info_ref *ref, SIZE_T count,
MEMORY_WORKING_SET_EX_INFORMATION *info )
{
struct kinfo_vmentry *entry = NULL;
int i;
SIZE_T i;
int j;
for (i = 0; i < d->vmentry_count; i++)
for (i = 0; i < count; ++i)
{
if (d->vmentries[i].kve_start <= (ULONG_PTR)p->VirtualAddress && (ULONG_PTR)p->VirtualAddress <= d->vmentries[i].kve_end)
MEMORY_WORKING_SET_EX_INFORMATION *p = &info[ref[i].orig_index];
struct kinfo_vmentry *entry = NULL;
for (j = 0; j < d->vmentry_count; j++)
{
entry = &d->vmentries[i];
if (d->vmentries[j].kve_start <= (ULONG_PTR)p->VirtualAddress && (ULONG_PTR)p->VirtualAddress <= d->vmentries[j].kve_end)
{
entry = &d->vmentries[j];
break;
}
}
@ -5198,6 +5204,7 @@ static void fill_working_set_info( struct fill_working_set_info_data *d, struct
if (p->VirtualAttributes.Valid)
p->VirtualAttributes.Win32Protection = get_win32_prot( vprot, view->protect );
}
}
#else
static int pagemap_fd = -2;
@ -5223,9 +5230,16 @@ static void free_fill_working_set_info_data( struct fill_working_set_info_data *
}
static void fill_working_set_info( struct fill_working_set_info_data *d, struct file_view *view, BYTE vprot,
MEMORY_WORKING_SET_EX_INFORMATION *p )
struct working_set_info_ref *ref, SIZE_T count,
MEMORY_WORKING_SET_EX_INFORMATION *info )
{
MEMORY_WORKING_SET_EX_INFORMATION *p;
UINT64 pagemap;
SIZE_T i;
for (i = 0; i < count; ++i)
{
p = &info[ref[i].orig_index];
if (pagemap_fd == -1 ||
pread( pagemap_fd, &pagemap, sizeof(pagemap), ((UINT_PTR)p->VirtualAddress >> page_shift) * sizeof(pagemap) ) != sizeof(pagemap))
@ -5241,6 +5255,7 @@ static void fill_working_set_info( struct fill_working_set_info_data *d, struct
if (p->VirtualAttributes.Valid)
p->VirtualAttributes.Win32Protection = get_win32_prot( vprot, view->protect );
}
}
#endif
static int compare_working_set_info_ref( const void *a, const void *b )
@ -5259,7 +5274,6 @@ static NTSTATUS get_working_set_ex( HANDLE process, LPCVOID addr,
struct fill_working_set_info_data data;
char *start, *end;
SIZE_T i, count;
size_t size;
struct file_view *view, *prev_view;
sigset_t sigset;
BYTE vprot;
@ -5304,13 +5318,11 @@ static NTSTATUS get_working_set_ex( HANDLE process, LPCVOID addr,
while (start != (char *)view->base + view->size && r != ref + count
&& r->addr < (char *)view->base + view->size)
{
size = get_committed_size( view, start, end - start, &vprot, ~VPROT_WRITEWATCH );
while (r != ref + count && r->addr < start + size)
{
if (vprot & VPROT_COMMITTED) fill_working_set_info( &data, view, vprot, &info[r->orig_index] );
++r;
}
start += size;
start += get_committed_size( view, start, end - start, &vprot, ~VPROT_WRITEWATCH );
i = 0;
while (r + i != ref + count && r[i].addr < start) ++i;
if (vprot & VPROT_COMMITTED) fill_working_set_info( &data, view, vprot, r, i, info );
r += i;
}
if (r == ref + count) break;
view = RB_ENTRY_VALUE( rb_next( &view->entry ), struct file_view, entry );