Ошибка Win32-Api CreateFile() в C++

Следующий код работает на одном ПК, но не на другом ПК. Оба ПК имеют Windows 7 в качестве своей ОС.

char device_name[] = "\\\\.\\interception00";
printf("device_name: %s \n", device_name);

device_array[i].handle = CreateFile(device_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

DWORD error = GetLastError();
printf("GetLastError (Number): %d, ", error);

if (error == ERROR_FILE_NOT_FOUND)
{
    printf("error == ERROR_FILE_NOT_FOUND \n");
}
else if (error == ERROR_SUCCESS)
{
    printf("error == ERROR_SUCCESS \n");
}
else
{
    printf("error == UNBEKANNT \n");
}

Вывод ПК, который успешно открывает файл:

device_name: \\.\interception00
GetLastError (Number): 0, error == ERROR_SUCCESS

Другой ПК не может открыть файл. Результат:

device_name: \\.\interception00
GetLastError (Number): 2, error == ERROR_FILE_NOT_FOUND 

Кто-нибудь знает, почему это происходит? Может проблема в недостаточных правах?


person Andre    schedule 23.03.2016    source источник
comment
Вероятно, на втором компьютере не работает драйвер, который создает специальный файл для этого устройства.   -  person Ben Voigt    schedule 23.03.2016
comment
Ваша проверка ошибок несколько фиктивна. Вызывайте GetLastError только в случае сбоя вызова API. Вы не проверяете на провал.   -  person David Heffernan    schedule 23.03.2016


Ответы (1)


Из CreateFile() документации MSDN:

OPEN_EXISTING

Открывает файл или устройство, только если они существуют.

Если указанный файл или устройство не существует, функция завершается сбоем, а код последней ошибки устанавливается равным ERROR_FILE_NOT_FOUND (2).

Таким образом, это означает, что \\\\.\\interception00 существует на одном компьютере, но не существует на другом. Попробуйте посмотреть с помощью какой-нибудь другой программы, которая обычно способна открыть файл/устройство.

Или просто исправить, что \\\\.\\interception00 недоступен.

person Bernd Elkemann    schedule 23.03.2016
comment
Знаете ли вы способ/инструмент для просмотра всех доступных устройств? - person Andre; 24.03.2016
comment
Я не. Прости. Кто-нибудь другой? - person Bernd Elkemann; 24.03.2016
comment
Теперь я знаю. Это программа под названием WinObj :) - person Andre; 24.03.2016
comment
Знаете ли вы, как исправить, чтобы \\\\.\\interception00 был доступен? - person Andre; 30.03.2016
comment
Я даже не знаю, для чего нужен этот спецфайл (специальные файлы можно использовать для чего угодно), а информации о перехвате00 в сети нет. На другом компьютере есть драйвер, предоставляющий этот путь. Вам нужно это программное обеспечение и на втором компьютере. Если вы не знаете, какое это программное обеспечение, я бы посоветовал (1) использовать агент-разнос для поиска всего жесткого диска на предмет перехвата, если вы не узнали, какое программное обеспечение обеспечивает перехват00, попробуйте то же самое, используя grepWin для поиска по всему жесткому диску. жесткий диск. - person Bernd Elkemann; 30.03.2016