Невозможно последовательно обработать файл размером более 250 КБ, используя сопоставление файлов Windows с кусками размера n - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать программное обеспечение, которое принимает текстовый файл и xor каждые 4 байта с заранее заданным числом.
Я делаю это, отображая файл в памяти и открывая фрагменты файла с MapViewOfFile размера n.
Алгоритм, который я прилагаю, хорошо работает для текстовых файлов размером менее 250 кб.Но для файла> 250 КБ это только xor некоторых частей файла, и я не могу понять, почему и как это исправить.
Может кто-нибудь помочь мне?

#include "stdafx.h"
#include "Windows.h"
#include <stdio.h>
#include <stdint.h>
#include <iso646.h>
#include <math.h>

unsigned int strToUl(char *s)
{
    int size = 4;
    unsigned int ul = 0;
    memcpy(&ul, (unsigned int *)s, size);
    return ul;
}

char *ulToStr(unsigned int *ul)
{
    int size = 4;
    char *tch = (char *)calloc(size, sizeof(char *));
    memcpy(tch, (char *)ul, size);
    return tch;
}

unsigned int uixor(unsigned int n, unsigned int seed)
{
    srand(seed);
    unsigned int mask = rand();
    char ch[5] = { 0 };
    strcpy_s(ch, 5, ulToStr(&n));
    for (int j = 0; j < 5; j++)
    {
        ch[j] = ch[j] ^ mask;
    }
    return strToUl(ch);
}

BOOL mapWriteChunk(PHANDLE phFile, DWORD dwFileSize, int start, int buffsize, uint32_t xork)
{
    DWORD offset = start;// / 4;// / sizeof(DWORD);
    SYSTEM_INFO SysInfo;
    GetSystemInfo(&SysInfo);
    DWORD dwSysGran = SysInfo.dwAllocationGranularity;
    DWORD dwFileMapStart = (offset/dwSysGran) * dwSysGran;
    DWORD dwMapViewSize = (offset % dwSysGran) + buffsize;
    DWORD dwFileMapSize = offset + buffsize;

    unsigned int *ulMVBuffer = (unsigned int *)MapViewOfFile(*phFile, FILE_MAP_ALL_ACCESS, 0, dwFileMapStart, 0);
    if (ulMVBuffer == NULL)
    {
        printf("ulMVBuffer = NULL\n");
    }

    int iViewDelta = offset - dwFileMapStart;

    for (int i = 0; i < buffsize; i++)
    {
        unsigned int *u = (unsigned int *)ulMVBuffer + (iViewDelta + i);
        unsigned int u1 = *u;
        unsigned int u2 = uixor(u1, xork);
        *u = u2;
        printf("write on %d -> ", iViewDelta);
    }

    UnmapViewOfFile(ulMVBuffer);

    return TRUE;
}

int main()
{
    char name[] = "test.txt";

    OFSTRUCT tOfStrIn;
    tOfStrIn.cBytes = sizeof tOfStrIn;
    HANDLE hFile = (HANDLE)OpenFile(name, &tOfStrIn, OF_READWRITE);
    DWORD dwFileSize = GetFileSize(hFile, NULL);

    HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwFileSize, NULL);
    if (hFileMap == NULL)
    {
        printf("hFileMap = NULL\n");
    }


    int pos = 0;
    int chunk = 4;
    int bSize = dwFileSize / sizeof(DWORD);
    int rseed = 10;

    for (pos = 0; pos < bSize; pos+=chunk)
    {
        mapWriteChunk(&hFileMap, dwFileSize, pos, chunk, rseed);
    }

    CloseHandle(hFile);
    CloseHandle(hFileMap);
    system("PAUSE");
    return 0;
}

1 Ответ

0 голосов
/ 23 мая 2018

Хорошо, я разобрался с проблемой, и я пишу здесь, чтобы любой, у кого такая же проблема, знал, что случилось.Разговор дешевый, я покажу вам код (а затем объясню):

char *ulMVBuffer = (char *)MapViewOfFile(phFile, FILE_MAP_ALL_ACCESS, 0, dwFileMapStart, 0);
if (ulMVBuffer == NULL)
{
    printf("ulMVBuffer = NULL\n");
}

int iViewDelta = offset - dwFileMapStart;

unsigned int mask = myrand(xork);
for(int i = 0; i < buffsize; i++)
{
    unsigned int c = ulMVBuffer[iViewDelta + i] ^ mask;
    ulMVBuffer[iViewDelta + i] = c;
}

Итак, вам нужно отобразить память с помощью указателя на символ, а затем, когда вы используете оператор XOR, вот так:

unsigned int c = ulMVBuffer[iViewDelta + i] ^ mask;

Вы получаете XOR, который будет применен к группе из 4 байтов, а не только к 1 байту, потому что - насколько я понял, играя вокруг - XOR между символом (1 байт) иunsigned int (4 байта) заставляет оператора выбрать еще 3 байта из памяти и использовать его для побитовой операции.Это не работало, используя указатель на unsigned int, потому что, я думаю, он сохранял байты в памяти другим способом (может быть, ОС или зависит от машины?), И поэтому вы могли XOR только 1 байт каждые 4, а не группыиз 4 байтов все вместе.

Если кто-то лучше понимает это или хочет добавить больше к этому решению, я буду более чем рад прочитать его!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...