Почему переименование reg.exe в Windows Server 2008 x64 вызывает сбой при запуске? - PullRequest
8 голосов
/ 23 февраля 2010

У меня тут интересный вопрос.

Существует утилита reg.exe, которая поставляется с Windows довольно долгое время. Это очень удобно для импорта файлов .reg из сценариев, изменения значений из сценариев и т. Д., И т. Д. Поэтому при создании копии для сценария сценария («Почему бы не использовать копию в system32?» и т. д.) Я заметил, что переименование приводит к сбою:

Windows Server 2008 x64:

Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>reg.exe
ERROR: Invalid syntax.
Type "REG /?" for usage.

C:\Windows\system32>copy reg.exe reg2.exe
        1 file(s) copied.

C:\Windows\system32>reg2.exe

C:\Windows\system32>reg2.exe /?


C:\Windows\system32>reg.exe /?

REG Operation [Parameter List]

  Operation  [ QUERY   | ADD    | DELETE  | COPY    |
               SAVE    | LOAD   | UNLOAD  | RESTORE |
               COMPARE | EXPORT | IMPORT  | FLAGS ]

Return Code: (Except for REG COMPARE)

  0 - Successful
  1 - Failed

For help on a specific operation type:

  REG Operation /?

Examples:

  REG QUERY /?
  REG ADD /?
  REG DELETE /?
  REG COPY /?
  REG SAVE /?
  REG RESTORE /?
  REG LOAD /?
  REG UNLOAD /?
  REG COMPARE /?
  REG EXPORT /?
  REG IMPORT /?
  REG FLAGS /?

C:\Windows\system32>

Но с Windows XP x86:

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\chris>cd \WINDOWS\system32

C:\WINDOWS\system32>reg.exe

Console Registry Tool for Windows - version 3.0
Copyright (C) Microsoft Corp. 1981-2001.  All rights reserved


REG Operation [Parameter List]

  Operation  [ QUERY   | ADD    | DELETE  | COPY    |
               SAVE    | LOAD   | UNLOAD  | RESTORE |
               COMPARE | EXPORT | IMPORT ]

Return Code: (Except of REG COMPARE)

  0 - Succussful
  1 - Failed

For help on a specific operation type:

  REG Operation /?

Examples:

  REG QUERY /?
  REG ADD /?
  REG DELETE /?
  REG COPY /?
  REG SAVE /?
  REG RESTORE /?
  REG LOAD /?
  REG UNLOAD /?
  REG COMPARE /?
  REG EXPORT /?
  REG IMPORT /?

C:\WINDOWS\system32>copy reg.exe reg2.exe
        1 file(s) copied.

C:\WINDOWS\system32>reg2.exe

Console Registry Tool for Windows - version 3.0
Copyright (C) Microsoft Corp. 1981-2001.  All rights reserved


REG Operation [Parameter List]

  Operation  [ QUERY   | ADD    | DELETE  | COPY    |
               SAVE    | LOAD   | UNLOAD  | RESTORE |
               COMPARE | EXPORT | IMPORT ]

Return Code: (Except of REG COMPARE)

  0 - Succussful
  1 - Failed

For help on a specific operation type:

  REG Operation /?

Examples:

  REG QUERY /?
  REG ADD /?
  REG DELETE /?
  REG COPY /?
  REG SAVE /?
  REG RESTORE /?
  REG LOAD /?
  REG UNLOAD /?
  REG COMPARE /?
  REG EXPORT /?
  REG IMPORT /?

C:\WINDOWS\system32>

WinDbg, кажется, говорит мне, что ЭЛТ убивает его:

Child-SP          RetAddr           Call Site
00000000`0016f798 00000000`779d2f8b ntdll!ZwTerminateProcess+0xa
00000000`0016f7a0 000007fe`fe97d832 ntdll!RtlExitUserProcess+0x8b
00000000`0016f7d0 00000000`ffe7f710 msvcrt!cinit+0x13b
00000000`0016f810 00000000`778a495d reg!DynArrayGetItemType2+0x1fc
00000000`0016f850 00000000`779d8791 kernel32!BaseThreadInitThunk+0xd
00000000`0016f880 00000000`00000000 ntdll!RtlUserThreadStart+0x1d

Но так как я не слишком опытен с WinDbg (а этот 64-битный, так что, скажем, Ollydbg терпит неудачу), я здесь в некотором затруднении. Спасибо за любую информацию, которую вы, ребята, имеете.

Редактировать

Благодаря помощи CyberShadow и небольшому поиску, я нашел решение: он ищет .mui (перевод) в подпапке текущего установленного языка.

Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>cd en-US

C:\Windows\System32\en-US>copy reg.exe.mui reg2.exe.mui
        1 file(s) copied.

C:\Windows\System32\en-US>cd ..

C:\Windows\System32>reg2
ERROR: Invalid syntax.
Type "REG /?" for usage.

C:\Windows\System32>del en-US\reg2.exe.mui

C:\Windows\System32>reg2

C:\Windows\System32>

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Немного поиграв с отладчиком, я обнаружил, что LoadString (которая используется для получения сообщений об использовании и ошибках) возвращает ERROR_MUI_FILE_NOT_LOADED. Я думаю, что это как-то объясняет :)

Примечания:

  • Эта трассировка стека, кажется, вводит в заблуждение (или, по крайней мере, мы видим разные проблемы с одинаковым эффектом). Приложение завершается нормально, ничего не печатая при копировании / переименовании.
  • Помимо невозможности отображать сообщения, утилита продолжает работать очень хорошо.
  • Это также влияет на 32-битную версию (которую вы можете найти в SysWOW64).
0 голосов
/ 23 февраля 2010

Дикая догадка здесь, но некоторые приложения используют имя приложения, чтобы определить, что оно должно делать - это старый трюк UNIX; например, /bin/false и /bin/true - идентичные двоичные файлы, но имя определяет, какой результат вернуть.

Вы делаете это, когда заканчиваете писать 2+ программы, которые идентичны на 99,9%, и вы не хотите поддерживать отдельные кодовые базы для каждой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...