Форум программистов, компьютерный форум CyberForum.ru

Ошибка копирования файла - C++

Восстановить пароль Регистрация
 
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
08.08.2013, 22:09     Ошибка копирования файла #1
Здравствуйте. Никак не могу скопировать файл.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    char * buffer;
    int len = 10240;
    ifstream infile("C:\\Windows\\System32\\Drivers1\\nvlddmkm.sy_", ios::in | ios::binary);
    if(!infile){cout << "ifstream infile(""C:\\Windows\\System32\\Drivers1\\nvlddmkm.sy_";}
    ofstream outfile("C:\\Windows\\System32\\Drivers1\\nvlddmkm.sys", ios::out | ios::binary);
    if(!outfile){cout << "ofstream outfile(""C:\\Windows\\System32\\Drivers1\\nvlddmkm.sys";}
    buffer = new char[len];
    while (!infile.eof()){
        infile.read(buffer, len);
        if(infile.gcount()) outfile.write(buffer, infile.gcount());
    }
    infile.close();
    outfile.close();
    delete[] buffer;
    return 0;
}
Если же в коде меняю строчки
C++
1
2
ifstream infile("C:\\Windows\\System32\\Drivers1\\nvlddmkm.sy_", ios::in | ios::binary);
ofstream outfile("C:\\Windows\\System32\\Drivers1\\nvlddmkm.sys", ios::out | ios::binary);
на
C++
1
2
ifstream infile("nvlddmkm.sy_", ios::in | ios::binary);
ofstream outfile("nvlddmkm.sys", ios::out | ios::binary);
то все работает. Программу запускаю от администратора, ошибка уже на стадии чтения файла.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.08.2013, 00:40     Ошибка копирования файла #2
Цитата Сообщение от nanshakov Посмотреть сообщение
ошибка уже на стадии чтения файла.
Какая ошибка? Прав хватает, чтобы в System32 записывать?
Dragokas
Автор FAQ
 Аватар для Dragokas
14520 / 6347 / 785
Регистрация: 25.12.2011
Сообщений: 9,882
Записей в блоге: 14
09.08.2013, 01:00     Ошибка копирования файла #3
А что за странная папка такая System32\\Drivers1
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
09.08.2013, 01:21  [ТС]     Ошибка копирования файла #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Какая ошибка? Прав хватает, чтобы в System32 записывать?
Запускаю с привилегиями администратора, ПКМ запуск от имени адм. Должно хватить.
А какая ошибка - нз, выбивает исключение.
Цитата Сообщение от Dragokas Посмотреть сообщение
А что за странная папка такая System32\\Drivers1
Для теста, в релизной версии станет просто Drivers, пишу скрипт замены драйвера, т.к он вызывает на ряде компьютеров сбои.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.08.2013, 02:26     Ошибка копирования файла #5
Цитата Сообщение от nanshakov Посмотреть сообщение
выбивает исключение.
Какое? ОС какая?

Добавлено через 3 минуты
Цитата Сообщение от nanshakov Посмотреть сообщение
ошибка уже на стадии чтения файла.
Как это видите?

Добавлено через 1 минуту
Цитата Сообщение от nanshakov Посмотреть сообщение
запускаю от администратора
В 7, часто, этого недостаточно (в отличие от XP), там есть ещё главный (настоящий администратор).

Добавлено через 1 минуту
Путь измените на свои документы, если будет нормально работать, значит дело в правах.

Добавлено через 56 минут
Вот так напишите и увидете, что до чтения там дело просто не доходит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    ifstream infile("C:\\Windows\\System32\\Drivers1\\nvlddmkm.sy_", ios::in | ios::binary);
    if(!infile) cout << "Error ifstream infile nvlddmkm.sy_ !" << endl;
    else
    {
        ofstream outfile("C:\\Windows\\System32\\Drivers1\\nvlddmkm.sys", ios::out | ios::binary);
        if(!outfile) cout << "Error ofstream outfile nvlddmkm.sys !" << endl;
        else
        {
    
            char * buffer;
            int len = 10240;
            buffer = new char[len];
            while (!infile.eof())
            {
                infile.read(buffer, len);
                streamsize n = infile.gcount();
                if(n) outfile.write(buffer, n);
            }
            infile.close();
            outfile.close();
    
            delete[] buffer;
        }
    }
    system("pause");
    return 0;
nanshakov
Студент :)
890 / 323 / 10
Регистрация: 29.01.2011
Сообщений: 1,680
09.08.2013, 09:08  [ТС]     Ошибка копирования файла #6
alsav22, ОС Windwos 8, скорее всего действительно не хватает прав (проверяю это). Но, почему так ? Ведь моя уч. запись имеет права администратора (хоть и урезанные, знаю). Но разве команда запустить от имени админ. не дает полных прав ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.08.2013, 10:07     Ошибка копирования файла #7
Цитата Сообщение от nanshakov Посмотреть сообщение
Но разве команда запустить от имени админ. не дает полных прав ?
В XP администратор обладает полными правами, в 7 - нет (сам когда-то мучился с этим). В 8, наверное, тоже так. Не знаю точно, поможет ли это (когда-то пробовал в 7), но чтобы получить больше прав, нужно зайти в систему под встроенной учётной записью администратора. По умолчанию она отключена. Включается в Администрировании - Управление компьютером - Локальные прользователи и группы - Пользователи.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 10:27     Ошибка копирования файла
Еще ссылки по теме:

Ошибка копирования динамической строки в классе C++
Ошибка в конструкторе копирования C++
C++ ошибка в перегрузке конструктора копирования

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dragokas
Автор FAQ
 Аватар для Dragokas
14520 / 6347 / 785
Регистрация: 25.12.2011
Сообщений: 9,882
Записей в блоге: 14
09.08.2013, 10:27     Ошибка копирования файла #8
Не знаю, как в Win8, в Win7 по идее должно помочь затребование повышенных прав (должно отображаться диалоговое окно UAC) - в манифест прописать HighestAvaliable. И получить права SE_DEBUG:

SE_DEBUG
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>     /* cout */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* system, NULL, EXIT_FAILURE */
#include <Windows.h>
 
// Declaring Prototypes
BOOL SetPrivilege(HANDLE, LPCTSTR, BOOL) ;
BOOL EnableDebugPrivilages(); 
 
int main(int argc, char *argv[])
{
    EnableDebugPrivilages();
    system("pause");
}
 
BOOL EnableDebugPrivilages()
{
    HANDLE hToken;
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken );
    BOOL ret = SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
    CloseHandle(hToken);
    return ret;
}
 
BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
    ) 
{
    TOKEN_PRIVILEGES tp;
    LUID luid;
 
    if ( !LookupPrivilegeValue( 
        NULL,            // lookup privilege on local system
        lpszPrivilege,   // privilege to lookup 
        &luid ) )        // receives LUID of privilege
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
        return FALSE; 
    }
 
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;
 
    // Enable the privilege or disable all privileges.
    if ( !AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) )
    {
        std::cerr << "AdjustTokenPrivileges error: " << GetLastError() << "\n";
        return FALSE;
    }
 
    if ( GetLastError() == ERROR_NOT_ALL_ASSIGNED )
    {
        std::cerr << "SE_DEBUG failed.\n";
        return FALSE;
    }
 
    std::cerr << "SE_DEBUG granted.\n";
    return TRUE;
}


Про манифест сами найдете. Или можете временно пробовать запускать ПКМ "От имени администратора".

А вообще нужно смотреть в свойства этого файла - на вкладке "Безопасность". Какой группе доступны права "чтение/запись". От этого и отталкиваться.

Если там вообще указаны Local System, тогда придется через службу, или как вариант через psexec:

Bash
1
psexec -i -s app.exe
Yandex
Объявления
09.08.2013, 10:27     Ошибка копирования файла
Ответ Создать тему
Опции темы

Текущее время: 09:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru