On Wednesday, April 23 2014, "Corinna Vinschen" wrote to "cygwin at cygwin.com" saying: > Rather than calling GetFileInformationByHandle, try this > > #include > > [...] > > NTSTATUS status; > IO_STATUS_BLOCK io; > FILE_NETWORK_OPEN_INFORMATION fnoi; > > status = NtQueryInformationFile (file, &io, &fnoi, sizeof fnoi, > FileNetworkOpenInformation); > if (!NT_SUCCESS (status)) > { > fprintf (stderr, "NtQueryInformationFile: 0x%08x\n", status); > [...] > } > printf("%s: NtQueryInformationFile: nFileSize=%" PRIu64 "\n", > argv[i], fnoi.EndOfFile.QuadPart); > > Maybe that's really the problem. If so, either the EndOfFile info > is wrong, or (more likely) the call to NtQueryInformationFile returns > with a non-0 status code, which would be interesting to know. It's > probably not STATUS_INVALID_PARAMETER, otherwise you probably wouldn't > have seen a problem at all. > > Replacing the above call with > > FILE_STANDARD_INFORMATION fsi; > status = NtQueryInformationFile (file, &io, &fsi, sizeof fsi, > FileStandardInformation); > [...] > printf("%s: NtQueryInformationFile: nFileSize=%" PRIu64 "\n", > argv[i], fsi.EndOfFile.QuadPart); > > should then give the correct result. Okay, looks like FileNetworkOpenInformation is succeeding, but returning a bad EndOfFile value. $ ./win32-size-test 'z:\foo' z:\foo: NtQueryInformationFile(FileNetworkOpenInformation): EndOfFile=0 z:\foo: NtQueryInformationFile(FileStandardInformation): EndOfFile=12 $ gdb --quiet --args ./win32-size-test.exe 'z:\foo' Reading symbols from /cygdrive/z/Emacs-Modtime/win32-size-test.exe...done. (gdb) break 82 Breakpoint 1 at 0x100401400: file win32-size-test.c, line 82. (gdb) run Starting program: /cygdrive/z/Emacs-Modtime/win32-size-test.exe z:\\foo [New Thread 10540.0x48dc] [New Thread 10540.0x39d4] z:\\foo: NtQueryInformationFile(FileNetworkOpenInformation): EndOfFile=0 z:\\foo: NtQueryInformationFile(FileStandardInformation): EndOfFile=12 Breakpoint 1, main (argc=2, argv=0x22aaf0) at win32-size-test.c:82 82 if (!CloseHandle(file)) { (gdb) p fnoi $1 = {CreationTime = {{LowPart = 1493948928, HighPart = 30367507}, u = { LowPart = 1493948928, HighPart = 30367507}, QuadPart = 130427450920000000}, LastAccessTime = {{LowPart = 1493948928, HighPart = 30367507}, u = {LowPart = 1493948928, HighPart = 30367507}, QuadPart = 130427450920000000}, LastWriteTime = {{LowPart = 1493948928, HighPart = 30367507}, u = {LowPart = 1493948928, HighPart = 30367507}, QuadPart = 130427450920000000}, ChangeTime = {{LowPart = 1493948928, HighPart = 30367507}, u = {LowPart = 1493948928, HighPart = 30367507}, QuadPart = 130427450920000000}, AllocationSize = {{LowPart = 12, HighPart = 0}, u = {LowPart = 12, HighPart = 0}, QuadPart = 12}, EndOfFile = {{LowPart = 0, HighPart = 0}, u = {LowPart = 0, HighPart = 0}, QuadPart = 0}, FileAttributes = 128} (gdb) p fsi $2 = {AllocationSize = {{LowPart = 12, HighPart = 0}, u = {LowPart = 12, HighPart = 0}, QuadPart = 12}, EndOfFile = {{LowPart = 12, HighPart = 0}, u = {LowPart = 12, HighPart = 0}, QuadPart = 12}, NumberOfLinks = 1, DeletePending = 0 '\000', Directory = 0 '\000'} At this point this is looking pretty clearly like a Parallels Tools bug. I'll report it to them. > Also, to add handling for the Parallels filesystem to Cygwin, I'd > need the info printed by the getVolInfo tool from the csih package: > > $ /usr/lib/csih/getVolInfo /cygdrive/z $ /usr/lib/csih/getVolInfo.exe /cygdrive/z/ Device Type : 7 Characteristics : 10 Volume Name : Serial Number : 0 Max Filenamelength : 255 Filesystemname : Flags : 3 FILE_CASE_SENSITIVE_SEARCH : TRUE FILE_CASE_PRESERVED_NAMES : TRUE FILE_UNICODE_ON_DISK : FALSE FILE_PERSISTENT_ACLS : FALSE FILE_FILE_COMPRESSION : FALSE FILE_VOLUME_QUOTAS : FALSE FILE_SUPPORTS_SPARSE_FILES : FALSE FILE_SUPPORTS_REPARSE_POINTS: FALSE FILE_SUPPORTS_REMOTE_STORAGE: FALSE FILE_VOLUME_IS_COMPRESSED : FALSE FILE_SUPPORTS_OBJECT_IDS : FALSE FILE_SUPPORTS_ENCRYPTION : FALSE FILE_NAMED_STREAMS : FALSE FILE_READ_ONLY_VOLUME : FALSE FILE_SEQUENTIAL_WRITE_ONCE : FALSE FILE_SUPPORTS_TRANSACTIONS : FALSE Here's my test code. Compiles with either Cygwin or mingw64 GCC, but not classic mingw or Visual Studio due to missing headers/declarations. Link with -lntdll.