Advertisement
Guest User

os42

a guest
Nov 15th, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.87 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define MAX_LEN 255
  6.  
  7. HANDLE fileHandle = NULL, mapHandle = NULL;
  8. LPVOID mapAddr = NULL;
  9.  
  10. void createMappingFile() {
  11.     printf("Введите путь к создаваемому файлу\nНапример: \"C:\\Tools\\NewFile\" \".\\NewFile\" (в текущем каталоге)\n");
  12.     char filePath[MAX_LEN];
  13.     if (fgets(filePath, MAX_LEN, stdin)){
  14.         fflush(stdin);
  15.         filePath[strlen(filePath) - 1] = '\0';
  16.         SECURITY_ATTRIBUTES secAttr = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
  17.         fileHandle = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE, 0, &secAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  18.         if (fileHandle == INVALID_HANDLE_VALUE) {
  19.             DWORD err = GetLastError();
  20.             if (err == ERROR_FILE_NOT_FOUND)
  21.                 printf("Ошибка: файл не существует\n");
  22.             else if (err == ERROR_PATH_NOT_FOUND)
  23.                 printf("Ошибка: путь к файлу не существует\n");
  24.             else
  25.                 printf("Ошибка: код ошибки %ld\n", err);
  26.         }
  27.         else {
  28.             PLARGE_INTEGER fileSize = (PLARGE_INTEGER)malloc(sizeof *fileSize);
  29.             GetFileSizeEx(fileHandle, fileSize);
  30.             printf("Размер открытого файла: %I64d\n", fileSize -> QuadPart);
  31.             PLARGE_INTEGER mapSize = (PLARGE_INTEGER)malloc(sizeof *mapSize);
  32.             printf("Введите размер проецируемого файла (0 значит, что он равен размеру открытого файла, но если он не 0): ");
  33.             do {
  34.                 scanf("%I64d", &(mapSize -> QuadPart));
  35.                 fflush(stdin);
  36.             } while ((fileSize -> QuadPart == 0) && (mapSize -> QuadPart == 0));
  37.             char mapName[MAX_LEN];
  38.             printf("Введите имя для проекции файла\n");
  39.             fgets(mapName, MAX_LEN, stdin);
  40.             fflush(stdin);
  41.             mapName[strlen(mapName) - 1] = '\0';
  42.             if (mapHandle)
  43.                 CloseHandle(mapHandle);
  44.             mapHandle = CreateFileMappingA(fileHandle, &secAttr, PAGE_READWRITE, mapSize -> HighPart, mapSize -> LowPart, mapName);
  45.             if (!mapHandle)
  46.                 printf("Ошибка: код ошибки %ld\n", GetLastError());
  47.             else if (GetLastError() == ERROR_ALREADY_EXISTS)
  48.                 printf("Проецируемый файл уже существует");
  49.             free(fileSize);
  50.             free(mapSize);
  51.             CloseHandle(fileHandle);
  52.         }
  53.     }
  54.     else {
  55.         fflush(stdin);
  56.         printf("Ошибка при считывании ввода\n");
  57.     }
  58. }
  59.  
  60. void mapView() {
  61.     if (mapAddr)
  62.         UnmapViewOfFile(mapAddr);
  63.     mapAddr = MapViewOfFile(mapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  64.     if (!mapAddr)
  65.         printf("Ошибка: код ошибки %ld\n", GetLastError());
  66.     else
  67.         printf("Файл успешно спроецирован по адресу %p\n", mapAddr);
  68. }
  69.  
  70. void setData() {
  71.     printf("Введите данные, которые хотите ввести в проецируемый файл: ");
  72.     char buf[MAX_LEN];
  73.     if (fgets(buf, MAX_LEN, stdin)) {
  74.         fflush(stdin);
  75.         buf[strlen(buf) - 1] = '\0';
  76.         if (mapAddr) {
  77.             memcpy(mapAddr, buf, strlen(buf));
  78.         }
  79.         else {
  80.             printf("Ошибка при вводе данных\n");
  81.         }
  82.     }
  83.     else {
  84.         fflush(stdin);
  85.         printf("Ошибка при считывании ввода\n");
  86.     }
  87. }
  88.  
  89. int main()
  90. {
  91.     int flag = 1;
  92.     system("chcp 65001");
  93.     do {
  94.         printf("Добро пожаловать! Выберите действие:\n1 - Создание проецируемого файла\n2 - Проецирование фрагмента файла в память\n"
  95.             "3 - Запись данных в проецируемый файл\n4 - Выход\n");
  96.         char c = getchar();
  97.         fflush(stdin);
  98.         switch (c){
  99.             case '1':
  100.                 createMappingFile();
  101.                 break;
  102.             case '2':
  103.                 mapView();
  104.                 break;
  105.             case '3':
  106.                 setData();
  107.                 break;
  108.             case '4':
  109.                 printf("Выход из программы\n");
  110.                 if (mapHandle)
  111.                     CloseHandle(mapHandle);
  112.                 if (mapAddr)
  113.                     UnmapViewOfFile(mapAddr);
  114.                 flag = 0;
  115.                 break;
  116.             default:
  117.                 printf("Неправильный ввод, попробуйте еще раз\n");
  118.         }
  119.     } while (flag);
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement