Забавная багофича 64-битной Windows

May 30, 2013 22:11

Как-то раз наткнулся я на забавную багофичу, связанную с особенностями работы Windows. Эта заметка - о ней и о том чем она вызвана :)

Мне нужно было запустить команду «query session» из перлового скрипта.
Вот так работает:

C:\>query session
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console smozhayskiy 1 Active
rdp-tcp 65536 Listen
Теперь пробуем из перла:

C:\>perl -e "print `query session`;"
'query' is not recognized as an internal or external command,
operable program or batch file.

C:\>perl -e "print `cmd /c query session`;"
'query' is not recognized as an internal or external command,
operable program or batch file.

C:\>perl -e "print `C:\\Windows\\System32\\query.exe session`;"
'C:\Windows\System32\query.exe' is not recognized as an internal or external command,
operable program or batch file.
Что за хрень? Ведь просто из консоли работает! И файл существует и лежит по правильному пути:

C:\>dir c:\Windows\System32\query.exe
Volume in drive C has no label.
Volume Serial Number is 0217-D54C

Directory of c:\Windows\System32

14.07.2009 03:39 16 384 query.exe
1 File(s) 16 384 bytes
0 Dir(s) 13 338 664 960 bytes free
После недолгого исследования удалось выяснить причину столь необычного поведения.
Сама Windows у нас была 64-битная, а Perl, который в ней установлен - 32-битный.
Ну так вот, когда из 32-битного приложения на 64-битной системе вызываются системные приложения из папки System32, они на самом деле вызываются из папки SysWOW64 (об этом написано вот здесь: http://msdn.microsoft.com/en-us/library/aa384187%28v=vs.85%29.aspx).
Но тут Microsoft подложила нам баальшую свинью - не все приложения, которые есть в папке System32, есть и в папке SysWOW64! И вот этот query.exe присутствует только в 64-битной версии, а из 32-битных приложений его вызвать нельзя. Ну, вернее, почти нельзя - в статье по ссылке описано как обойти это ограничение:

C:\>perl -e "print `C:\\Windows\\Sysnative\\query.exe session`;"
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console smozhayskiy 1 Active
rdp-tcp 65536 Listen
JFYI. Может, пригодится когда-нибудь.

windows, perl

Previous post
Up