Problem report: SHRINKER.ERR, fix to DEVICE_Open/CreateFileA?

Robert Baruch autophile at starband.net
Thu Dec 6 14:52:03 CST 2001


This was an error I got when running a self-installing executable, 
power-structure-demo.exe, available from www.write-brain.com (a demo for 
Power Structure).

A error box appears with title SHRINKER.ERR and message:

(path)\power-structure-demo.exe (3.4)
(time&date) - Pager initialisation error 2 - File not found

and then the program quits.


Running with --debugmsg +all,+relay,+text,+string shows the following 
trace (only the part I think is significant):

----BEGIN TRACE----

0806d388:Call kernel32.CreateFileA(40612b20 
"\\\\.\\SHRINK34.LDR",00000000,00000000,00000000,00000003,04000000,00000000) 
ret=00761731
0806d388:trace:file:CreateFileA \\.\SHRINK34.LDR QUERY_ACCESS OPEN_EXISTING
0806d388:fixme:win32:DEVICE_Open Unknown/unsupported VxD SHRINK34.LDR. 
Try --winver nt40 or win31 !
0806d388:Ret  kernel32.CreateFileA() retval=ffffffff ret=00761731
0806d388:Call kernel32.GetWindowsDirectoryA(40616d3c,00000104) ret=0076180d
0806d388:trace:string:lstrcpynA (0x40616d3c, "C:\\WINDOWS", 260)
0806d388:Ret  kernel32.GetWindowsDirectoryA() retval=0000000a ret=0076180d
0806d388:Call kernel32.GetTempFileNameA(40612b1c 
"C:\\WINDOWS\\",0075c538 "000",00000000,40616d3c) ret=007617b2
0806d388:trace:file:CreateFileA C:\WINDOWS\000cf6e.tmp GENERIC_WRITE 
CREATE_NEW
0806d388:trace:dosfs:DOSFS_GetFullName C:\WINDOWS\000cf6e.tmp (last=0)
0806d388:trace:string:lstrcpynA (0x406119ec, "/mnt/dos", 1024)
0806d388:trace:dosfs:DOSFS_FindUnixName /mnt/dos,WINDOWS\000cf6e.tmp
0806d388:trace:heap:HeapAlloc (403b0000,00000002,0000022c): returning 
4042ef68
0806d388:trace:dosfs:DOSFS_FindUnixName (/mnt/dos,WINDOWS\000cf6e.tmp) 
-> windows (WINDOWS)
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:dosfs:DOSFS_FindUnixName /mnt/dos/windows,000cf6e.tmp
0806d388:trace:heap:HeapAlloc (403b0000,00000002,0000022c): returning 
4042ef68
0806d388:warn:dosfs:DOSFS_FindUnixName '000cf6e.tmp' not found in 
'/mnt/dos/windows'
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:dosfs:DOSFS_GetFullName returning 
/mnt/dos/windows/000cf6e.tmp =
C:\WINDOWS\000cf6e.tmp
0806d388:trace:dosfs:GetDriveTypeA ("C:\\WINDOWS\\000cf6e.tmp")
0806d388: create_file( access=40000000, inherit=0, sharing=00000000, 
create=1, attrs=00000080, drive_type=3, 
filename="/mnt/dos/windows/000cf6e.tmp" )
0806d388: create_file() = 0 { handle=52 }
0806d388:trace:file:FILE_GetTempFileName created C:\WINDOWS\000cf6e.tmp
0806d388: close_handle( handle=52 )
0806d388: close_handle() = 0 { fd=-1 }
0806d388:trace:dosfs:DOSFS_GetFullName C:\WINDOWS\000cf6e.tmp (last=0)
0806d388:trace:string:lstrcpynA (0x40612234, "/mnt/dos", 1024)
0806d388:trace:dosfs:DOSFS_FindUnixName /mnt/dos,WINDOWS\000cf6e.tmp
0806d388:trace:heap:HeapAlloc (403b0000,00000002,0000022c): returning 
4042ef68
0806d388:trace:dosfs:DOSFS_FindUnixName (/mnt/dos,WINDOWS\000cf6e.tmp) 
-> windows (WINDOWS)
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:dosfs:DOSFS_FindUnixName /mnt/dos/windows,000cf6e.tmp
0806d388:trace:heap:HeapAlloc (403b0000,00000002,0000022c): returning 
4042ef68
0806d388:trace:dosfs:DOSFS_FindUnixName (/mnt/dos/windows,000cf6e.tmp) 
-> 000cf6e.tmp (000CF6E.TMP)
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:dosfs:DOSFS_GetFullName returning 
/mnt/dos/windows/000cf6e.tmp =
C:\WINDOWS\000CF6E.TMP
0806d388:trace:file:FILE_GetTempFileName returning C:\WINDOWS\000cf6e.tmp
0806d388:Ret  kernel32.GetTempFileNameA() retval=0000cf6e ret=007617b2
0806d388:Call kernel32.CreateFileA(40616d3c 
"C:\\WINDOWS\\000cf6e.tmp",40000000,00000000,00000000,00000002,00000080,00000000) 
ret=00761013
0806d388:trace:file:CreateFileA C:\WINDOWS\000cf6e.tmp GENERIC_WRITE 
CREATE_ALWAYS
0806d388:trace:dosfs:DOSFS_GetFullName C:\WINDOWS\000cf6e.tmp (last=0)
0806d388:trace:string:lstrcpynA (0x40612210, "/mnt/dos", 1024)
0806d388:trace:dosfs:DOSFS_FindUnixName /mnt/dos,WINDOWS\000cf6e.tmp
0806d388:trace:heap:HeapAlloc (403b0000,00000002,0000022c): returning 
4042ef68
0806d388:trace:dosfs:DOSFS_FindUnixName (/mnt/dos,WINDOWS\000cf6e.tmp) 
-> windows (WINDOWS)
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:dosfs:DOSFS_FindUnixName /mnt/dos/windows,000cf6e.tmp
0806d388:trace:heap:HeapAlloc (403b0000,00000002,0000022c): returning 
4042ef68
0806d388:trace:dosfs:DOSFS_FindUnixName (/mnt/dos/windows,000cf6e.tmp) 
-> 000cf6e.tmp (000CF6E.TMP)
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:dosfs:DOSFS_GetFullName returning 
/mnt/dos/windows/000cf6e.tmp =
C:\WINDOWS\000CF6E.TMP
0806d388:trace:dosfs:GetDriveTypeA ("C:\\WINDOWS\\000CF6E.TMP")
0806d388: create_file( access=40000000, inherit=0, sharing=00000000, 
create=2, attrs=00000080, drive_type=3, 
filename="/mnt/dos/windows/000cf6e.tmp" )
0806d388: create_file() = 0 { handle=52 }
0806d388:Ret  kernel32.CreateFileA() retval=00000034 ret=00761013
0806d388:Call 
kernel32.WriteFile(00000034,40612c38,00003288,40612c04,00000000) 
ret=00761063
0806d388:trace:file:WriteFile 52 0x40612c38 12936 0x40612c04 (nil)
0806d388: get_handle_fd( handle=52, access=40000000 )
0806d388: *fd* 52 -> 16
0806d388: get_handle_fd() = 0 { fd=-1, type=1 }
0806d388: set_handle_info( handle=52, flags=0, mask=0, fd=10 )
0806d388: set_handle_info() = 0 { old_flags=0, cur_fd=10 }
0806d388:Ret  kernel32.WriteFile() retval=00000001 ret=00761063
0806d388:Call kernel32.CloseHandle(00000034) ret=00760f0d
0806d388: close_handle( handle=52 )
0806d388: close_handle() = 0 { fd=10 }
0806d388:Ret  kernel32.CloseHandle() retval=00000001 ret=00760f0d
0806d388:Call kernel32.CreateFileA(40612b20 
"\\\\.\\C:\\WINDOWS\\000cf6e.tmp",00000000,00000000,00000000,00000003,04000000,00000000) 
ret=00761731
0806d388:trace:file:CreateFileA \\.\C:\WINDOWS\000cf6e.tmp QUERY_ACCESS 
OPEN_EXISTING
0806d388:fixme:win32:DEVICE_Open Unknown/unsupported VxD 
C:\WINDOWS\000cf6e.tmp. Try --winver nt40 or win31 !
0806d388:Ret  kernel32.CreateFileA() retval=ffffffff ret=00761731
0806d388:Call kernel32.DeleteFileA(40616d3c "C:\\WINDOWS\\000cf6e.tmp") 
ret=00761911
0806d388:trace:file:DeleteFileA 'C:\WINDOWS\000cf6e.tmp'
0806d388:trace:dosfs:DOSFS_GetFullName C:\WINDOWS\000cf6e.tmp (last=1)
0806d388:trace:string:lstrcpynA (0x40612384, "/mnt/dos", 1024)
0806d388:trace:dosfs:DOSFS_FindUnixName /mnt/dos,WINDOWS\000cf6e.tmp
0806d388:trace:heap:HeapAlloc (403b0000,00000002,0000022c): returning 
4042ef68
0806d388:trace:dosfs:DOSFS_FindUnixName (/mnt/dos,WINDOWS\000cf6e.tmp) 
-> windows (WINDOWS)
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:dosfs:DOSFS_FindUnixName /mnt/dos/windows,000cf6e.tmp
0806d388:trace:heap:HeapAlloc (403b0000,00000002,0000022c): returning 
4042ef68
0806d388:trace:dosfs:DOSFS_FindUnixName (/mnt/dos/windows,000cf6e.tmp) 
-> 000cf6e.tmp (000CF6E.TMP)
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:dosfs:DOSFS_GetFullName returning 
/mnt/dos/windows/000cf6e.tmp =
C:\WINDOWS\000CF6E.TMP
0806d388:Ret  kernel32.DeleteFileA() retval=00000001 ret=00761911
0806d388:Call kernel32.GetLastError() ret=00760303
0806d388:Ret  kernel32.GetLastError() retval=00000002 ret=00760303
0806d388:Call kernel32.GetLocalTime(40612bf8) ret=00761d66
0806d388:Ret  kernel32.GetLocalTime() retval=00000000 ret=00761d66
0806d388:Call kernel32.GetLocalTime(40612bf8) ret=00761cd4
0806d388:Ret  kernel32.GetLocalTime() retval=00000000 ret=00761cd4
0806d388:Call 
kernel32.FormatMessageA(00001000,00000000,00000002,00000400,0075d54b,000000c8,00000000) 
ret=00760493
0806d388:trace:resource:FormatMessageA 
(0x1000,(nil),2,0x400,0x75d54b,200,(nil))0806d388:trace:resource:load_messageA 
instance = 40667000, id = 00000002, buffer = (nil), length = 100
0806d388:trace:resource:RES_FindResource2 (40667000, 0000000b, 00000001, 
0400, W, PE)
0806d388:trace:resource:RES_LoadResource (40667000, 406ac8c0, PE)
0806d388:trace:resource:LockResource (406974e0)
0806d388:trace:resource:load_messageA   - strlen=20
0806d388:trace:heap:HeapAlloc (403b0000,00000002,00000018): returning 
4042ef68
0806d388:trace:resource:load_messageA instance = 40667000, id = 
00000002, buffer = 0x4042ef68, length = 21
0806d388:trace:resource:RES_FindResource2 (40667000, 0000000b, 00000001, 
0400, W, PE)
0806d388:trace:resource:RES_LoadResource (40667000, 406ac8c0, PE)
0806d388:trace:resource:LockResource (406974e0)
0806d388:trace:resource:load_messageA   - strlen=20
0806d388:trace:string:lstrcpynA (0x4042ef68, "File not found\n", 20)
0806d388:trace:resource:load_messageA 'File not found
' copied !
0806d388:trace:heap:HeapAlloc (403b0000,0000000a,00000064): returning 
4042ef8c
0806d388:trace:heap:HeapReAlloc (403b0000,0000000a,4042ef8c,000000c8): 
returning 4042ef8c
0806d388:trace:resource:FormatMessageA -- "File not found\r\n"
0806d388:trace:string:lstrcpynA (0x75d54b, "File not found\r\n", 200)
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef8c): returning TRUE
0806d388:trace:heap:HeapFree (403b0000,00000002,4042ef68): returning TRUE
0806d388:trace:resource:FormatMessageA -- returning 16
0806d388:Ret  kernel32.FormatMessageA() retval=00000010 ret=00760493
0806d388:Call kernel32.GetModuleHandleA(40612bf4 "USER32") ret=0075fbdf
0806d388:Ret  kernel32.GetModuleHandleA() retval=406e2000 ret=0075fbdf
0806d388:Call kernel32.GetProcAddress(406e2000,0075b05c "MessageBoxA") 
ret=0075fbfd
0806d388:trace:win32:MODULE_GetProcAddress (406e2000,MessageBoxA)
0806d388:trace:win32:PE_FindExportedFunction (MessageBoxA)
0806d388:Ret  kernel32.GetProcAddress() retval=4077f8e0 ret=0075fbfd
0806d388:Call user32.MessageBoxA(00000000,0075d4e0 "C:\\My 
Documents\\installs\\power-structure-demo.exe (3.4) 12/06/01 15:05:02 - 
Page"...,0075b3e8 "SHRINKER.ERR",00002030) ret=0075fc1a
0806d388:warn:dialog:MessageBoxA Messagebox


----END TRACE----


The program apparently tries to open a file called \\.\SHRINK34.LDR, 
which fails because SHRINK34.LDR doesn't exist.

The next thing the program does is create a temporary file 
(C:\WINDOWS\000cf6e.tmp here), write 0x3288 bytes of stuff to it 
(successfully), close it, and then try to re-open it with \\.\ prepended 
to the filename. That fails, resulting in the message box.

CreateFileA (files/file.c) will handle filenames prepended with \\.\ 
specially. If the file begins with \\.\pipe\ then we open a pipe. If the 
filename is a DOS device, we open that. Otherwise we fall through to 
DEVICE_Open (win32/device.c) which checks to see if the file is a known 
VxD. In this trace, it fails.

I've been looking through the Microsoft documentation. In the 
documentation for opening VxD's ( 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win32/devio_886c.asp) 
it says:

"CreateFile checks for a filename extension to determine whether VxDName 
  specifies a file. If a filename extension (such as .VXD) is present, 
the function looks for the file in the standard search path. In the 
following example, CreateFile looks for the SAMPLE.VXD file in the 
standard search path." (example: \\.\SAMPLE.VXD)

In addition, under the documentation for CreateFile 
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/filesio_7wmd.asp) 
it says:

"There is no trailing backslash in a drive name. The string "\\.\c:\" 
refers to the root directory of drive C."

So could it be that in DEVICE_Open or CreateFileA, opening a file 
prepended with \\.\ that starts with a drive letter and has a filename 
extension should just open the file?

--Rob





More information about the wine-users mailing list