2017-02-21 32 views
2

Я создаю приложение для управления другими приложениями или exe-файлами на компьютере пользователя и не позволяю им получать доступ к ним в определенное время (например, функция блокировки приложения ColdTurkey).Остановка исполняемого файла exe C++

Так я пытаюсь сделать это не работает до сих пор - я попытался сделать это, открыв файл dwShareMode набор в 0, используя функциюCreateFile. Это похоже на файлы, такие как текстовые файлы, и не позволяет открыть файл, однако это не тот случай, если я попытаюсь сделать этот же подход в exe-файлах, и пользователь может открыть файл.

Я предполагаю, что файлы exe не так «читаются» Windows, как текстовый файл считывается блокнотом, а это означает, что установка dwShareMode на 0 не влияет на его открытие, однако я не знаю, что разница между ними. Любая помощь будет оценена по достоинству.

код здесь (для текстового файла):

#include <windows.h> 
#include <string> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    HANDLE test; 
    test = CreateFile("test.txt", 
     GENERIC_WRITE, 
     0, 
     NULL, 
     CREATE_NEW, 
     FILE_ATTRIBUTE_NORMAL, 
     NULL); 

    cout << "press enter to stop blocking application: "; 
    string b; 
    getline(cin, b); 
    cout << endl; 
    CloseHandle(test); 
    return 0; 
} 
+4

*** и остановить их от доступа к ним в определенное время *** Я считаю, что вы, скорее всего, придется сделать это на уровне системного драйвера. – drescherjm

+2

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

+0

Обычная безопасность Windows работает на уровне файлов. Я могу думать о некоторых причинах, чтобы делать что-то взломанным способом, а не просто использовать службы ОС, но все они являются гнусной причиной. –

ответ

2

Ваш код работает отлично для меня, чтобы блокировать выполнение файла. Вам нужно указать OPEN_EXISTING вместо CREATE_NEW (потому что вы не пытаетесь создать здесь новый файл).

+0

Большое спасибо, это была очень глупая ошибка: – Cole

-1

Не эксперт по окнам - я привык к Unix/Linux и использую пакет Cygwin, поэтому я могу программировать «в Unix» на рабочем столе Windows, но мне кажется, что вам нужно установить параметр lpSecurityAttributes , тот, который приходит после dwShareMode.

Я думаю, что следующая страница может быть полезным: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364399(v=vs.85).aspx

+2

'NULL' - вполне допустимое значение для' lpSecurityAttributes'. Со страницы, на которую вы ссылаетесь: «Если вы укажете NULL для параметра lpSecurityAttributes, файл или каталог получит дескриптор безопасности по умолчанию». –

+0

Да, но дескриптор безопасности по умолчанию разрешает доступ к EXECUTE. Cole хочет, чтобы пользователи _prevent_ выполняли приложения, о которых идет речь. Для этого ему необходимо изменить разрешения. –

+1

Дескриптор безопасности в этой функции относится к атрибутам безопасности возвращаемого * дескриптора *, а не к разрешениям файла на диске. Кроме того, нет презумпции, что приложение-блокиратор имеет разрешение на изменение разрешения на выполнение исполняемого файла на диске, но открытие файла в режиме без совместного доступа будет прекрасным. –