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 (); | ||||
|   int init (); | ||||
|   bool stat_real_file_once (); | ||||
|   void nominate_forkable (PCWCHAR); | ||||
|   bool create_forkable (); | ||||
|   void run_dtors () | ||||
|  |  | |||
|  | @ -155,10 +155,10 @@ rmdirs (WCHAR ntmaxpathbuf[NT_MAX_PATH]) | |||
|    file name, as GetModuleFileNameW () yields the as-loaded name. | ||||
|    While we have the file handle open, also read the attributes. | ||||
|    NOTE: Uses dll_list::nt_max_path_buf (). */ | ||||
| static bool | ||||
| stat_real_file_once (dll *d) | ||||
| bool | ||||
| dll::stat_real_file_once () | ||||
| { | ||||
|   if (d->fii.IndexNumber.QuadPart != -1LL) | ||||
|   if (fii.IndexNumber.QuadPart != -1LL) | ||||
|     return true; | ||||
| 
 | ||||
|   tmp_pathbuf tp; | ||||
|  | @ -171,35 +171,37 @@ stat_real_file_once (dll *d) | |||
|   RtlInitEmptyUnicodeString (&msi2.SectionFileName, tp.w_get (), 65535); | ||||
| 
 | ||||
|   /* 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); | ||||
|   while (NT_SUCCESS (status) && | ||||
| 	!RtlEqualUnicodeString (&msi2.SectionFileName, | ||||
| 				&pmsi1->SectionFileName, FALSE)) | ||||
|     { | ||||
|       debug_printf ("for %s at %p got memory section name '%W'", | ||||
| 	ntname, handle, pmsi1->SectionFileName.Buffer); | ||||
|       RtlCopyUnicodeString (&msi2.SectionFileName, &pmsi1->SectionFileName); | ||||
|       if (fhandle != INVALID_HANDLE_VALUE) | ||||
| 	NtClose (fhandle); | ||||
|       pmsi1->SectionFileName.Buffer[pmsi1->SectionFileName.Length] = L'\0'; | ||||
|       fhandle = dll_list::ntopenfile (pmsi1->SectionFileName.Buffer, &fstatus); | ||||
|       status = NtQueryVirtualMemory (NtCurrentProcess (), d->handle, | ||||
|       status = NtQueryVirtualMemory (NtCurrentProcess (), handle, | ||||
| 				     MemorySectionName, pmsi1, 65536, NULL); | ||||
|     } | ||||
|   if (!NT_SUCCESS (status)) | ||||
|     system_printf ("WARNING: Unable (ntstatus %y) to query real file for %W", | ||||
| 		   status, d->ntname); | ||||
| 		   status, ntname); | ||||
|   else if (fhandle == INVALID_HANDLE_VALUE) | ||||
|     system_printf ("WARNING: Unable (ntstatus %y) to open real file for %W", | ||||
| 		   fstatus, d->ntname); | ||||
| 		   fstatus, ntname); | ||||
|   if (fhandle == INVALID_HANDLE_VALUE) | ||||
|     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", | ||||
| 		   pmsi1->SectionFileName.Buffer); | ||||
| 
 | ||||
|   NtClose (fhandle); | ||||
|   return d->fii.IndexNumber.QuadPart != -1LL; | ||||
|   return fii.IndexNumber.QuadPart != -1LL; | ||||
| } | ||||
| 
 | ||||
| /* easy use of NtOpenFile */ | ||||
|  | @ -605,7 +607,7 @@ dll_list::prepare_forkables_nomination () | |||
| { | ||||
|   dll *d = &dlls.start; | ||||
|   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 (); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue