MinHook – The Minimalistic x86/x64 API Hooking Library (fork)

MinHook is a Windows API hooking library originally written by Tsuda Kageyu.
It’s probably the best free WinAPI library out there which supports both x86 and x64.
But it’s not perfect, and didn’t completely fit my needs, so I created a fork on GitHub which addresses some of its limitations.

Below you’ll see how the fork improves upon the original MinHook library.
Read More…

Posted in Programming at September 30th, 2013. 6 Comments.

A command-line screenshot maker

When googling for a command-line screenshot maker, all I found was a bloated 3 MB tool and this nifty piece of code.
So I took it and added some command line options I needed:

-filename "my screeny.png"    file name (default: screenshot.png)
-encoder png                  file encoder: bmp/jpeg/gif/tiff/png (default: png)
-quality 100                  file quality for jpeg (between 0 and 100)
-resize 50                    image size, % of the original size (between 1 and 99)

Perhaps it’s gonna be useful to others, so I’m releasing it.
The code and a compiled binary are attached.

rar source.rar (2.97 KB)
rar binary.rar (20.24 KB)

GitHub repository:
https://github.com/RaMMicHaeL/cmdline-screenshot-maker

Posted in Programming at November 16th, 2009. 7 Comments.

Custom Buffer-Manipulation Routines

Here’s my rewrite of the Custom Buffer-Manipulation Routines by Piotr Mintus.
Optimized for and works on 32-bit and 64-bit environments.

//**********************************************************************
// File: buffer.h
//	
// Custom Buffer-Manipulation Routines
//
// By RaMMicHaeL, 12.10.2009
//**********************************************************************

#ifndef _BUFFER_H_
#define _BUFFER_H_

#ifdef FillMemory
#undef FillMemory
#endif
#ifdef ZeroMemory
#undef ZeroMemory
#endif
#ifdef CopyMemory
#undef CopyMemory
#endif
#ifdef MoveMemory
#undef MoveMemory
#endif

__forceinline 
void FillMemory(PVOID Destination, SIZE_T Length, BYTE Fill)
{
	SIZE_T *sizet_p;
	unsigned char *uchar_p;
	SIZE_T sizet_fill;
	SIZE_T count;

	sizet_p = (SIZE_T *)Destination;

	count = Length/sizeof(SIZE_T);
	if(count)
	{
		sizet_fill = Fill;
		sizet_fill |= sizet_fill << 8;
		sizet_fill |= sizet_fill << 16;

#ifdef _WIN64
		sizet_fill |= sizet_fill << 32;
#endif

		do
			*(sizet_p++) = sizet_fill;
		while(--count);
	}

	uchar_p = (unsigned char *)sizet_p;

	count = Length & (sizeof(SIZE_T)-1);
	if(count)
	{
		do
			*(uchar_p++) = Fill;
		while(--count);
	}
}

#define ZeroMemory(Destination, Length) FillMemory(Destination, Length, 0)

__forceinline 
void CopyMemory(PVOID Destination, const VOID *Source, SIZE_T Length)
{
	SIZE_T *sizet_p_dest, *sizet_p_src;
	unsigned char *uchar_p_dest, *uchar_p_src;
	SIZE_T count;

	sizet_p_dest = (SIZE_T *)Destination;
	sizet_p_src = (SIZE_T *)Source;

	count = Length/sizeof(SIZE_T);
	if(count)
	{
		do
			*(sizet_p_dest++) = *(sizet_p_src++);
		while(--count);
	}

	uchar_p_dest = (unsigned char *)sizet_p_dest;
	uchar_p_src = (unsigned char *)sizet_p_src;

	count = Length & (sizeof(SIZE_T)-1);
	if(count)
	{
		do
			*(uchar_p_dest++) = *(uchar_p_src++);
		while(--count);
	}
}

__forceinline 
void MoveMemory(PVOID Destination, const VOID *Source, SIZE_T Length)
{
	SIZE_T *sizet_p_dest, *sizet_p_src;
	unsigned char *uchar_p_dest, *uchar_p_src;
	SIZE_T count;

	if(Destination > Source)
	{
		// Copy in reverse

		uchar_p_dest = (unsigned char *)Destination+Length;
		uchar_p_src = (unsigned char *)Source+Length;

		count = Length & (sizeof(SIZE_T)-1);
		if(count)
		{
			do
				*(--uchar_p_dest) = *(--uchar_p_src);
			while(--count);
		}

		sizet_p_dest = (SIZE_T *)uchar_p_dest;
		sizet_p_src = (SIZE_T *)uchar_p_src;

		count = Length/sizeof(SIZE_T);
		if(count)
		{
			do
				*(--sizet_p_dest) = *(--sizet_p_src);
			while(--count);
		}
	}
	else
		CopyMemory(Destination, Source, Length);
}

#endif  // _BUFFER_H_
Posted in Programming at October 12th, 2009. No Comments.