Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
#1

Если каждого консольного процесса существует свой дескриптор буфер экрана, то где именно он находится? - C++

05.09.2013, 19:30. Просмотров 345. Ответов 0
Метки нет (Все метки)

То есть фишка в чём: если мы создадим консольный процесс, а потом ИЗМЕНИМ буфер экрана и сделаем его активным, то чёрта с два мы туда что-нибудь запишем общеизвестными функциям, например system ("dir"):

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
#include <windows.h>
#include <stdio.h>
using namespace std;
 
 
int main() 
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
  HANDLE  hConsoleOutput;    // для дескриптора буфера экрана
 
  //хэндл экрана новый
  HANDLE hStdOutNew; 
  
                                          //+  
                                          //+  
                                          //+  
                                          //+  
   
  //создадим буфер экрана (новый) 
  hStdOutNew = CreateConsoleScreenBuffer( 
    GENERIC_READ | GENERIC_WRITE, // чтение и запись 
    0,                            //не разделяемый 
    NULL,                         // защита по умолчанию 
    CONSOLE_TEXTMODE_BUFFER,      // текстовый режим 
    NULL);                        //не используется 
 
                                          //+  
                                          //+  
                                          //+  
                                          //+  
  
  //Проверим, правильно ли создали
  if (hStdOutNew == INVALID_HANDLE_VALUE) 
  {
    printf ("всё плохо\n"); 
    return GetLastError(); 
  }
 
                                          //+  
                                          //+  
                                          //+  
                                          //+  
  
  //Если правильно создали делаем активным новый буфер экрана 
  if (!SetConsoleActiveScreenBuffer(hStdOutNew)) 
  { 
    printf ("всё плохо\n"); 
    return GetLastError(); 
  } 
  
  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  
  system ("dir");
  printf ("этой надписи мы никогда не увидим, равно как и вывода dir\n"); 
  
  //Теперь чтобы записать что-то в новый буфер экрана, надо использовать, 
  //например WRiteConsole, где первым параметром идёт буфер экрана
  
  
  getchar ();
  
  return 0; 
}
Почему? Наверное, когда в дело вступает dir, она читает дескриптор буфера экрана, который СТАРЫЙ и туда и пишет, я не знаю. Как в этом убедиться? Если мои предположения верны, то дескриптор буфера экрана, вполне возможно, прописан в какой-нибудь PEB. Тогда его можно заменить на новый, просто прописав внаглую память процесса, dir при выполнении обратится к НОВОМУ дескриптору буфера экрана и всё будет круто.

Но где в памяти процесса прописан дескриптор буфера экрана, знает кто-нибудь?

Добавлено через 30 минут
Короче, вообще непонятно. Вроде как для установки дескриптора для устройств стандартного ввода данных (и вывода) существует функция SetStdHandle. То есть если мы её задействуем, тем самым мы и поменяем дескриптор на нужный (то, что мне и нужно, но я хотел память напрямую прописать). Но ничего не выходит
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
66
67
68
69
70
71
72
#include <windows.h>
#include <stdio.h>
using namespace std;
 
 
#include <windows.h>
#include <stdio.h>
using namespace std;
 
 
int main() 
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
  HANDLE  hConsoleOutput;    // для дескриптора буфера экрана
 
  //хэндл экрана новый
  HANDLE hStdOutNew; 
  
                                          //+  
                                          //+  
                                          //+  
                                          //+  
   
  //создадим буфер экрана (новый) 
  hStdOutNew = CreateConsoleScreenBuffer( 
    GENERIC_READ | GENERIC_WRITE, // чтение и запись 
    0,                            //не разделяемый 
    NULL,                         // защита по умолчанию 
    CONSOLE_TEXTMODE_BUFFER,      // текстовый режим 
    NULL);                        //не используется 
 
                                          //+  
                                          //+  
                                          //+  
                                          //+  
  
  //Проверим, правильно ли создали
  if (hStdOutNew == INVALID_HANDLE_VALUE) 
  {
    printf ("всё плохо\n"); 
    return GetLastError(); 
  }
 
                                          //+  
                                          //+  
                                          //+  
                                          //+  
  printf ("%d\n", SetStdHandle (STD_OUTPUT_HANDLE ,hStdOutNew));
  getchar ();
 
  
  //Если правильно создали делаем активным новый буфер экрана 
  if (!SetConsoleActiveScreenBuffer(hStdOutNew)) 
  { 
    printf ("всё плохо\n"); 
    return GetLastError(); 
  } 
  
  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  
  system ("dir");
  printf ("этой надписи мы никогда не увидим, равно как и вывода dir\n"); 
  
  //Теперь чтобы записать что-то в новый буфер экрана, надо использовать, 
  //например WRiteConsole, где первым параметром идёт буфер экрана
  
  
  getchar ();
  
  return 0; 
}
Добавлено через 20 часов 35 минут
А что, никто не задавался таким вопросом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 19:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Если каждого консольного процесса существует свой дескриптор буфер экрана, то где именно он находится? (C++):

Написать функцию, указывающая где именно находится ошибка (скобочный парсер) - C++
есть код проверяющий правильность скобочной последовательности, а как написать функцию,указывающую где именно ошибка?

Если файл существует, вывести красным цветом в центре экрана его размер и дату создания - Turbo Pascal
Ввести с клавиатуры имя файла; если он существует, вывести красным цветом в центре экрана его размер и дату создания; иначе –...

Существует ли дескриптор - C++ Builder
Сразу извиняюсь за, возможно, совсем уж глупый вопрос, но существует ли способ получения дескриптора bmp изображения? Изображение в формате...

Составить словарь, где для каждого города указать, в какой стране он находится - Python
Дан список стран и городов каждой страны(.Russia:Moscow Petersburg Novgorod Kaluga,Ukraine:Kiev Donetsk Odessa) Затем даны названия...

Получить дескриптор процесса, по его имени - Delphi WinAPI
Всем привет. Есть структура PROCESS_INFORMATION. Она заполняется только функцией CreateProcess, то есть когда создаётся процесс. Меня...

Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует? - C++
Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует?

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 19:30
Привет! Вот еще темы с ответами:

Добавление записи, если не существует, обновление. если существует - PHP БД
Доброго времени суток! Ситуация такая: Есть файл в который приходит ид ($content_id), нужно пройтись по таблице (в базе) и если такой...

Как определить ширину блока для каждого экрана в пикселях, если она прописана в процентах? - HTML, CSS
Как определить ширину блока для каждого экрана в пикселях, если она прописана в процентах? Просто задача - вставить в блок для...

Определить, где находится начало координат, если известны координаты вершин треугольника - Turbo Pascal
Известны координаты вершин треугольника. Определить где находится начало координат(внутри треугольника, снаружи или находится на одной из...

Как найти дескриптор процесса, зная его имя? - C++ WinAPI
как найти дескриптор (HANDLE) процесса, зная его имя? Добавлено через 2 часа 0 минут я не просил перемещать мою тему, тема создана...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.