Cygwin: dll_list: stat_real_file_once as dll method
Make stat_real_file_once a method of struct dll, to be more flexible on where to use. Also, debug print memory section name queried for a dll. This is a preparation to query the file id when loading the dll.
This commit is contained in:
parent
4c79da8017
commit
0f5776c47c
|
@ -65,6 +65,7 @@ struct dll
|
||||||
|
|
||||||
void detach ();
|
void detach ();
|
||||||
int init ();
|
int init ();
|
||||||
|
bool stat_real_file_once ();
|
||||||
void nominate_forkable (PCWCHAR);
|
void nominate_forkable (PCWCHAR);
|
||||||
bool create_forkable ();
|
bool create_forkable ();
|
||||||
void run_dtors ()
|
void run_dtors ()
|
||||||
|
|
|
@ -155,10 +155,10 @@ rmdirs (WCHAR ntmaxpathbuf[NT_MAX_PATH])
|
||||||
file name, as GetModuleFileNameW () yields the as-loaded name.
|
file name, as GetModuleFileNameW () yields the as-loaded name.
|
||||||
While we have the file handle open, also read the attributes.
|
While we have the file handle open, also read the attributes.
|
||||||
NOTE: Uses dll_list::nt_max_path_buf (). */
|
NOTE: Uses dll_list::nt_max_path_buf (). */
|
||||||
static bool
|
bool
|
||||||
stat_real_file_once (dll *d)
|
dll::stat_real_file_once ()
|
||||||
{
|
{
|
||||||
if (d->fii.IndexNumber.QuadPart != -1LL)
|
if (fii.IndexNumber.QuadPart != -1LL)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
tmp_pathbuf tp;
|
tmp_pathbuf tp;
|
||||||
|
@ -171,35 +171,37 @@ stat_real_file_once (dll *d)
|
||||||
RtlInitEmptyUnicodeString (&msi2.SectionFileName, tp.w_get (), 65535);
|
RtlInitEmptyUnicodeString (&msi2.SectionFileName, tp.w_get (), 65535);
|
||||||
|
|
||||||
/* Retry opening the real file name until that does not change any more. */
|
/* Retry opening the real file name until that does not change any more. */
|
||||||
status = NtQueryVirtualMemory (NtCurrentProcess (), d->handle,
|
status = NtQueryVirtualMemory (NtCurrentProcess (), handle,
|
||||||
MemorySectionName, pmsi1, 65536, NULL);
|
MemorySectionName, pmsi1, 65536, NULL);
|
||||||
while (NT_SUCCESS (status) &&
|
while (NT_SUCCESS (status) &&
|
||||||
!RtlEqualUnicodeString (&msi2.SectionFileName,
|
!RtlEqualUnicodeString (&msi2.SectionFileName,
|
||||||
&pmsi1->SectionFileName, FALSE))
|
&pmsi1->SectionFileName, FALSE))
|
||||||
{
|
{
|
||||||
|
debug_printf ("for %s at %p got memory section name '%W'",
|
||||||
|
ntname, handle, pmsi1->SectionFileName.Buffer);
|
||||||
RtlCopyUnicodeString (&msi2.SectionFileName, &pmsi1->SectionFileName);
|
RtlCopyUnicodeString (&msi2.SectionFileName, &pmsi1->SectionFileName);
|
||||||
if (fhandle != INVALID_HANDLE_VALUE)
|
if (fhandle != INVALID_HANDLE_VALUE)
|
||||||
NtClose (fhandle);
|
NtClose (fhandle);
|
||||||
pmsi1->SectionFileName.Buffer[pmsi1->SectionFileName.Length] = L'\0';
|
pmsi1->SectionFileName.Buffer[pmsi1->SectionFileName.Length] = L'\0';
|
||||||
fhandle = dll_list::ntopenfile (pmsi1->SectionFileName.Buffer, &fstatus);
|
fhandle = dll_list::ntopenfile (pmsi1->SectionFileName.Buffer, &fstatus);
|
||||||
status = NtQueryVirtualMemory (NtCurrentProcess (), d->handle,
|
status = NtQueryVirtualMemory (NtCurrentProcess (), handle,
|
||||||
MemorySectionName, pmsi1, 65536, NULL);
|
MemorySectionName, pmsi1, 65536, NULL);
|
||||||
}
|
}
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
system_printf ("WARNING: Unable (ntstatus %y) to query real file for %W",
|
system_printf ("WARNING: Unable (ntstatus %y) to query real file for %W",
|
||||||
status, d->ntname);
|
status, ntname);
|
||||||
else if (fhandle == INVALID_HANDLE_VALUE)
|
else if (fhandle == INVALID_HANDLE_VALUE)
|
||||||
system_printf ("WARNING: Unable (ntstatus %y) to open real file for %W",
|
system_printf ("WARNING: Unable (ntstatus %y) to open real file for %W",
|
||||||
fstatus, d->ntname);
|
fstatus, ntname);
|
||||||
if (fhandle == INVALID_HANDLE_VALUE)
|
if (fhandle == INVALID_HANDLE_VALUE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!dll_list::read_fii (fhandle, &d->fii))
|
if (!dll_list::read_fii (fhandle, &fii))
|
||||||
system_printf ("WARNING: Unable to read real file attributes for %W",
|
system_printf ("WARNING: Unable to read real file attributes for %W",
|
||||||
pmsi1->SectionFileName.Buffer);
|
pmsi1->SectionFileName.Buffer);
|
||||||
|
|
||||||
NtClose (fhandle);
|
NtClose (fhandle);
|
||||||
return d->fii.IndexNumber.QuadPart != -1LL;
|
return fii.IndexNumber.QuadPart != -1LL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* easy use of NtOpenFile */
|
/* easy use of NtOpenFile */
|
||||||
|
@ -605,7 +607,7 @@ dll_list::prepare_forkables_nomination ()
|
||||||
{
|
{
|
||||||
dll *d = &dlls.start;
|
dll *d = &dlls.start;
|
||||||
while ((d = d->next))
|
while ((d = d->next))
|
||||||
stat_real_file_once (d); /* uses nt_max_path_buf () */
|
d->stat_real_file_once (); /* uses nt_max_path_buf () */
|
||||||
|
|
||||||
PWCHAR pbuf = nt_max_path_buf ();
|
PWCHAR pbuf = nt_max_path_buf ();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue