Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

172 lines
3.5 KiB

#include <stdio.h>
#include <windows.h>
#include <winioctl.h>
int main(int argc, char *argv[ ])
{
BOOL b;
DWORD FsFlags;
LPSTR lp;
HANDLE hMod;
UINT w;
CHAR FileName[MAX_PATH];
HANDLE hFile;
DWORD Nbytes;
DWORD FileSize;
WORD State;
DWORD Length;
DWORD wrap;
b = GetVolumeInformation(NULL,NULL,0,NULL,NULL,&FsFlags,NULL,0);
if ( !b ) {
printf("compstrs: Failure getting volumeinformation %d\n",GetLastError());
return 0;
}
if ( !(FsFlags & FS_FILE_COMPRESSION) ) {
printf("compstrs: File system does not support per-file compression %x\n",FsFlags);
return 0;
}
//
// Get a temp file
//
w = GetTempFileName(".","cstr",0,FileName);
if ( !w ) {
printf("compstrs: unable to get temp file name\n");
return 0;
}
//
// Create the tempfile
//
hFile = CreateFile(
FileName,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if ( hFile == INVALID_HANDLE_VALUE ) {
printf("compstrs: failure creating %s %d\n",FileName,GetLastError());
return 0;
}
//
// Write the file that we want to compress. It is a copy of kernel32 and ntdll
//
hMod = GetModuleHandle("kernel32");
if ( !hMod ) {
printf("compstrs: failure getting handle to kernel32.dll\n");
CloseHandle(hFile);
DeleteFile(FileName);
return 0;
}
lp = (LPSTR)hMod;
b = TRUE;
FileSize = 0;
while(b) {
b = WriteFile(hFile,lp,512, &Nbytes, NULL);
if ( b ) {
FileSize += Nbytes;
lp += Nbytes;
}
}
hMod = GetModuleHandle("ntdll");
if ( !hMod ) {
printf("compstrs: failure getting handle to ntdll\n");
CloseHandle(hFile);
DeleteFile(FileName);
return 0;
}
lp = (LPSTR)hMod;
b = TRUE;
while(b) {
b = WriteFile(hFile,lp,512, &Nbytes, NULL);
if ( b ) {
FileSize += Nbytes;
lp += Nbytes;
}
}
wrap = 0;
while(1) {
//
// compress and de-compress this file forever
//
State = 1;
b = DeviceIoControl(
hFile,
FSCTL_SET_COMPRESSION,
&State,
sizeof(WORD),
NULL,
0,
&Length,
NULL
);
if ( !b ) {
printf("compstrs: compress failed %d\n",GetLastError());
wrap = 0;
}
else {
FlushFileBuffers(hFile);
printf("C");
wrap++;
}
Sleep(500);
//
// Decompress
//
State = 0;
b = DeviceIoControl(
hFile,
FSCTL_SET_COMPRESSION,
&State,
sizeof(WORD),
NULL,
0,
&Length,
NULL
);
if ( !b ) {
printf("compstrs: uncompress failed %d\n",GetLastError());
wrap = 0;
}
else {
FlushFileBuffers(hFile);
printf("U");
wrap++;
}
if ( wrap > 50 ) {
printf("\n");
wrap = 0;
}
}
CloseHandle(hFile);
DeleteFile(FileName);
}