mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-19 19:48:44 +00:00
ntdll: Fill range of output in fill_working_set_info().
This commit is contained in:
parent
27b74d8e37
commit
76ffdde095
|
@ -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 );
|
||||
|
|
Loading…
Reference in a new issue