mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
1.9 KiB
97 lines
1.9 KiB
#include <windows.h>
|
|
#include <stdio.h>
|
|
|
|
int _cdecl main(int argc, char** argv)
|
|
{
|
|
if(argc != 3)
|
|
{
|
|
fprintf(stderr, "Usage: infstrip <filename> <token>\n");
|
|
return -1;
|
|
}
|
|
|
|
HANDLE hFile;
|
|
hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ,
|
|
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
|
|
if(hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
fprintf(stderr, "Unable to open file %s\n", argv[1]);
|
|
return -1;
|
|
}
|
|
|
|
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY,0,0,
|
|
NULL);
|
|
if(!hMap)
|
|
{
|
|
fprintf(stderr, "Unable to open file %s\n", argv[1]);
|
|
return -1;
|
|
}
|
|
|
|
void* pFile;
|
|
|
|
pFile = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
|
|
if(!pFile)
|
|
{
|
|
fprintf(stderr, "Unable to open file %s\n", argv[1]);
|
|
return -1;
|
|
}
|
|
|
|
char* pStart = reinterpret_cast<char*>(pFile);
|
|
char* szSearchString = argv[2];
|
|
DWORD dwSize = GetFileSize(hFile, NULL);
|
|
char* pEnd = pStart + dwSize - 1;
|
|
int iPos = strlen(szSearchString)-1;
|
|
DWORD dwtruncationpoint = dwSize;
|
|
|
|
|
|
for(; pEnd >= pStart; pEnd--)
|
|
{
|
|
if(*pEnd == szSearchString[iPos])
|
|
{
|
|
// Match.
|
|
|
|
// Found the complete string.
|
|
if(iPos == 0)
|
|
{
|
|
// Mark this as the truncation point.
|
|
dwtruncationpoint = pEnd-pStart;
|
|
iPos = strlen(szSearchString)-1;
|
|
continue;
|
|
}
|
|
|
|
iPos--;
|
|
}
|
|
else
|
|
{
|
|
// Reset.
|
|
iPos = strlen(szSearchString)-1;
|
|
}
|
|
}
|
|
|
|
// Copy the file
|
|
char* pNewFile = new char[dwtruncationpoint];
|
|
memcpy(pNewFile, pStart, dwtruncationpoint);
|
|
|
|
|
|
// Close the previous file.
|
|
UnmapViewOfFile(pFile);
|
|
CloseHandle(hMap);
|
|
CloseHandle(hFile);
|
|
|
|
// Truncate the file
|
|
hFile = CreateFile(argv[1], GENERIC_WRITE, FILE_SHARE_READ,
|
|
NULL, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if(hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
fprintf(stderr, "Error truncating file");
|
|
return -1;
|
|
}
|
|
|
|
DWORD dwWritten = 0;
|
|
if(!WriteFile(hFile, pNewFile, dwtruncationpoint, &dwWritten, NULL))
|
|
{
|
|
fprintf(stderr, "Error writing file");
|
|
return -1;
|
|
}
|
|
CloseHandle(hFile);
|
|
return 0;
|
|
}
|