Почему эта программа иногда дает сбой, а иногда нет? - PullRequest
6 голосов
/ 24 июня 2011

Следующая программа выключает монитор. Он иногда падает, когда я его запускаю, а иногда нет. Разборка просто указывает на случайное место, такое как 0x00011000, и не имеет реальной информации.

Если я перекомпилирую программу и запустите ее, то перекомпилированная версия будет работать нормально, пока я ее тестирую. Но в следующий раз, когда я действительно буду нуждаться в его использовании, он снова рушится, и мне нужно перекомпилировать его ... заставляя меня сожалеть о том, что я сделал это в первую очередь.

Я понятия не имею, как последовательно воспроизвести ошибку. (То есть, кроме ее запуска, когда она мне крайне необходима, и наблюдения за ее падением.)

Что может быть причиной случайного сбоя в этой программе?

#include <Windows.h>
#include <tchar.h>

int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    return SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}

Я использую Windows 7 x64 и собираю это как 32-битную программу. Я думаю, что я попробовал то же самое с 64-разрядной версией и получил тот же результат, хотя я не уверен на 100%.


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

  • Если кто-то действительно воспроизводит это, пожалуйста, оставьте комментарий и дайте мне знать, мне любопытно, могут ли другие воспроизвести это.

  • В настоящее время я сам тестирую более урезанную версию (которая не зависит от времени выполнения C):

    #include <Windows.h>
    #pragma comment(linker, "/NoDefaultLib")
    #pragma comment(linker, "/Entry:mainCRTStartup")
    #pragma comment(linker, "/Subsystem:Windows")
    
    int mainCRTStartup()
    {
        return SendMessageW(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
    }
    
    /*
    Base64 version of this program, in case you want to use it:
    TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAABkN3fRfGzjEXxs4xF8bOMhv7ujEbxs4xF8bKMRPGzjIb+0IxE8bOMhv7pjETxs4xSaWNoRfGzjAAAAAAAAAAAUEUAAEwBAQBYIgROAAAAAAAAAADgAA8BCwEHCgACAAAAAAAAAAAAAAgQAAAAEAAAACAAAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAIAAAAAIAAAAAAAACAAAEAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAAAoEAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAHQAAAAAEAAAAAIAAAACAAAAAAAAAAAAAAAAAAAgAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYEAAAAAAAAGoCaHDxAABoEgEAAGj//wAA/xUAEEAA99gbwPfYw8zMUBAAAAAAAAAAAAAAaBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgQAAAAAAAAQgJTZW5kTWVzc2FnZVcAAFVTRVIzMi5kbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
    */
    

    В настоящее время эта версия работает ... но опять же, как и предыдущая, когда я перекомпилирую ее. Если выяснится, что этот не даст сбой, я выложу его здесь.

  • Если вы хотите воспроизвести это, вот мое предложение: скомпилируйте программу, дайте ей мариноваться в течение дня или двух. :) Когда вы какое-то время пользовались компьютером, попробуйте запустить программу пару раз ... когда я пытаюсь это сделать, я обычно получаю сообщение об ошибке, пока я не перекомпилирую программу заново.


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

Почему-то, когда вы хотите показать людям проблему, она волшебным образом решается. То же самое и здесь. Я буду продолжать пытаться воспроизвести ошибку, но на данный момент она работает нормально. : \ (У меня есть подозрение, что это может быть из-за установки Windows 7 SP1, но я действительно сомневаюсь в этом ... если я узнаю, я опубликую здесь.)

Извините за это всех ...


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

Хорошо ... как это происходит, когда вам нужно воспроизвести ошибку, вы не можете. : |

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

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Возможно, вы уже видели это, но суть этой статьи бога Windows Рэймонда Чена заключается в том, что использование HWND_BROADCAST таким способом не рекомендуется.Я нашел это с помощью комментариев на сайте, который не должен называться, в связи с тем, что используемый вами пример кода, хотя и является популярным, не является правильным способом справиться с отключением питания монитора.

Это не объясняет, почему вы видите именно то, что вы видите, но дает некоторые доказательства того, что данный код является подозрительным.

0 голосов
/ 25 июня 2011

Единственное, что имеет какой-либо смысл повторно.Ваше заявление о том, что оно работает, если вы перекомпилируете, состоит в том, что что-то хэширует exe и каким-то образом мешает ему.Это что-то, что в 99 случаях из 100 будет вирусным сканером, но вы говорите, что у вас его нет?

  1. Вы создаете исполняемый файл.Он имеет хэш 0x1234.
  2. Вы запускаете его.Антивирусный сканер хеширует его, позволяет запустить, а затем решает, что он делает что-то, что ему не нравится (например, передает сообщения о завершении работы всем окнам).
  3. Вы запускаете его снова.Вирусный сканер говорит: «Смотри, что 0x1234 запускается снова; я собираюсь залатать его, чтобы остановить передачу сообщений о выключении, или, может быть, я просто остановлю его вообще».
  4. Вы перестраиваете exe,У него новый хеш 0x4321 (хэш изменяется только потому, что у него новая дата создания / изменения).
  5. Вернуться к 2.
0 голосов
/ 24 июня 2011

Настройте свой антивирусный сканер так, чтобы приложение оставалось в покое и не мешало ему.

Ваше приложение слишком близко к evil winmain , чтобы игнорировать антивирусные сканеры здесь.

...