/*
Вход - 1. номер бита от 0, т.е. 0 - это первый бит в массиве. 2. Путь к файлу source. 3. Путь к файлу destination.
Выход - 0 - успех, -1 - номер бита больше чем размер первого или второго файла, код ошибки.
*/
DWORD ExchangeBit (DWORD numBit, TCHAR* FileNameS, TCHAR* FileNameD)
{
HANDLE h = NULL;
DWORD ret = 1;
assert (FileNameS);
assert (*FileNameS != TEXT('\0'));
assert (FileNameD);
assert (*FileNameD != TEXT('\0'));
__try
{
// 1 step
if ((h = ::CreateFile (FileNameS, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
__leave;
DWORD size = 0;
DWORD byte = numBit / 8;
DWORD numInByte = 7 - numBit % 8;
if ((size = ::GetFileSize (h, NULL)) == INVALID_FILE_SIZE)
__leave;
if (byte >= size)
{
assert (0);
ret = -1;
__leave;
}
if (::SetFilePointer (h, byte, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
__leave;
BYTE buf = 0;
if (!::ReadFile (h, &buf, 1, &size, NULL))
__leave;
buf ^= (1 << numInByte);
::CloseHandle (h);
h = NULL;
// 2 step
if ((h = ::CreateFile (FileNameD, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
__leave;
if ((size = ::GetFileSize (h, NULL)) == INVALID_FILE_SIZE)
__leave;
if (byte >= size)
{
assert (0);
ret = -1;
__leave;
}
if (::SetFilePointer (h, byte, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
__leave;
if (!::WriteFile (h, &buf, 1, &size, NULL))
__leave;
ret = 0;
}
__finally
{
if (ret && ret != -1)
ret = ::GetLastError ();
if (h)
::CloseHandle (h);
}
return ret;
}
Чтения одного бита из файла
Нужно прочитать один бит из ексе.И инвертировать его.И записать в другой файл.
Цитата:
Originally posted by DEMON_HUNTER
Нужно прочитать один бит из ексе.И инвертировать его.И записать в другой файл.
Нужно прочитать один бит из ексе.И инвертировать его.И записать в другой файл.
Или я вопроса не понял, или...
fopen(), fgetch(), потом ксоришь по маске и fputc(). Или я чего-то не понял.
А исходничек не напишете?
А на чистом си можете?
Не на с++.
Цитата:
Originally posted by DEMON_HUNTER
Уй как всё сложно!!!:(
А на чистом си можете?
Не на с++.
Уй как всё сложно!!!:(
А на чистом си можете?
Не на с++.
Это и был С, только использовал я WinApi, но можно и с использованием только ANSI C.
Код:
#include <stdio.h>
#include <assert.h>
#include <errno.h>
unsigned int ExchangeBitCRT (unsigned int numBit, char* FileNameS, char* FileNameD)
{
FILE* h;
unsigned int size = 0;
unsigned int byte = numBit / 8;
unsigned int numInByte = 7 - numBit % 8;
char buf = 0;
assert (FileNameS);
assert (*FileNameS != 0);
assert (FileNameD);
assert (*FileNameD != 0);
// Step 1
if (!(h = fopen (FileNameS, "rb")))
return errno;
if (fseek (h, byte, SEEK_SET))
{
fclose (h);
return errno;
}
buf = fgetc (h);
buf ^= (1 << numInByte);
fclose (h);
// Step 2
if (!(h = fopen (FileNameD, "r+b")))
return errno;
if (fseek (h, byte, SEEK_SET))
{
fclose (h);
return errno;
}
fputc (buf, h);
fclose (h);
return 0;
}
#include <assert.h>
#include <errno.h>
unsigned int ExchangeBitCRT (unsigned int numBit, char* FileNameS, char* FileNameD)
{
FILE* h;
unsigned int size = 0;
unsigned int byte = numBit / 8;
unsigned int numInByte = 7 - numBit % 8;
char buf = 0;
assert (FileNameS);
assert (*FileNameS != 0);
assert (FileNameD);
assert (*FileNameD != 0);
// Step 1
if (!(h = fopen (FileNameS, "rb")))
return errno;
if (fseek (h, byte, SEEK_SET))
{
fclose (h);
return errno;
}
buf = fgetc (h);
buf ^= (1 << numInByte);
fclose (h);
// Step 2
if (!(h = fopen (FileNameD, "r+b")))
return errno;
if (fseek (h, byte, SEEK_SET))
{
fclose (h);
return errno;
}
fputc (buf, h);
fclose (h);
return 0;
}