Fix for issues 1 & 2.
This commit is contained in:
parent
a551a6e6c8
commit
212adb101b
16
ANSI-LLW.c
Normal file
16
ANSI-LLW.c
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
ANSI-LLW.c - Output the 32-bit address of LoadLibraryW.
|
||||||
|
|
||||||
|
Jason Hood, 13 November, 2010 (LLA version 5 September, 2010).
|
||||||
|
|
||||||
|
I don't know of a method to retrieve the 32-bit address of a function in
|
||||||
|
64-bit code, so this is a simple workaround.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
int main( void )
|
||||||
|
{
|
||||||
|
return (DWORD)LoadLibraryW;
|
||||||
|
}
|
37
ANSI.c
37
ANSI.c
@ -53,6 +53,9 @@
|
|||||||
|
|
||||||
v1.30, 3 August to 7 September, 2010:
|
v1.30, 3 August to 7 September, 2010:
|
||||||
x64 support.
|
x64 support.
|
||||||
|
|
||||||
|
v1.31, 13 November, 2010:
|
||||||
|
fix multibyte conversion problems.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define UNICODE
|
#define UNICODE
|
||||||
@ -934,10 +937,10 @@ void Inject( LPPROCESS_INFORMATION pinfo, LPPROCESS_INFORMATION lpi,
|
|||||||
|
|
||||||
if (con)
|
if (con)
|
||||||
{
|
{
|
||||||
CHAR dll[MAX_PATH];
|
WCHAR dll[MAX_PATH];
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
DWORD len = GetModuleFileNameA( GetModuleHandleA( "ANSI64.dll" ),
|
DWORD len = GetModuleFileName( GetModuleHandleA( "ANSI64.dll" ),
|
||||||
dll, sizeof(dll) );
|
dll, lenof(dll) );
|
||||||
if (x86)
|
if (x86)
|
||||||
{
|
{
|
||||||
dll[len-6] = '3';
|
dll[len-6] = '3';
|
||||||
@ -949,7 +952,7 @@ void Inject( LPPROCESS_INFORMATION pinfo, LPPROCESS_INFORMATION lpi,
|
|||||||
InjectDLL64( pinfo, dll );
|
InjectDLL64( pinfo, dll );
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
GetModuleFileNameA( GetModuleHandleA( "ANSI32.dll" ), dll, sizeof(dll) );
|
GetModuleFileName( GetModuleHandleA( "ANSI32.dll" ), dll, lenof(dll) );
|
||||||
InjectDLL32( pinfo, dll );
|
InjectDLL32( pinfo, dll );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1091,28 +1094,26 @@ WINAPI MyWriteConsoleA( HANDLE hCon, LPCVOID lpBuffer,
|
|||||||
DWORD nNumberOfCharsToWrite,
|
DWORD nNumberOfCharsToWrite,
|
||||||
LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved )
|
LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved )
|
||||||
{
|
{
|
||||||
DWORD Mode;
|
DWORD Mode;
|
||||||
#define BUF_SIZE 4096
|
LPWSTR buf;
|
||||||
WCHAR buf[BUF_SIZE];
|
DWORD len;
|
||||||
DWORD len;
|
BOOL rc = TRUE;
|
||||||
BOOL rc = TRUE;
|
|
||||||
|
|
||||||
// if we write in a console buffer with processed output
|
// if we write in a console buffer with processed output
|
||||||
if (GetConsoleMode( hCon, &Mode ) && (Mode & ENABLE_PROCESSED_OUTPUT))
|
if (GetConsoleMode( hCon, &Mode ) && (Mode & ENABLE_PROCESSED_OUTPUT))
|
||||||
{
|
{
|
||||||
UINT cp = GetConsoleOutputCP();
|
UINT cp = GetConsoleOutputCP();
|
||||||
DEBUGSTR( TEXT("\\WriteConsoleA: %lu \"%.*hs\""), nNumberOfCharsToWrite, nNumberOfCharsToWrite, lpBuffer );
|
DEBUGSTR( TEXT("\\WriteConsoleA: %lu \"%.*hs\""), nNumberOfCharsToWrite, nNumberOfCharsToWrite, lpBuffer );
|
||||||
*lpNumberOfCharsWritten = 0;
|
len = MultiByteToWideChar( cp, 0, lpBuffer, nNumberOfCharsToWrite, NULL, 0 );
|
||||||
while (nNumberOfCharsToWrite)
|
buf = malloc( len * sizeof(WCHAR) );
|
||||||
|
if (buf == NULL)
|
||||||
{
|
{
|
||||||
len = (nNumberOfCharsToWrite > BUF_SIZE) ? BUF_SIZE
|
*lpNumberOfCharsWritten = 0;
|
||||||
: nNumberOfCharsToWrite;
|
return (nNumberOfCharsToWrite == 0);
|
||||||
MultiByteToWideChar( cp, 0, lpBuffer, len, buf, len );
|
|
||||||
rc = ParseAndPrintString( hCon, buf, len, &Mode );
|
|
||||||
*lpNumberOfCharsWritten += Mode;
|
|
||||||
lpBuffer += len;
|
|
||||||
nNumberOfCharsToWrite -= len;
|
|
||||||
}
|
}
|
||||||
|
MultiByteToWideChar( cp, 0, lpBuffer, nNumberOfCharsToWrite, buf, len );
|
||||||
|
rc = ParseAndPrintString( hCon, buf, len, lpNumberOfCharsWritten );
|
||||||
|
free( buf );
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
19
ansicon.c
19
ansicon.c
@ -37,10 +37,13 @@
|
|||||||
|
|
||||||
v1.30, 3 August to 7 September, 2010:
|
v1.30, 3 August to 7 September, 2010:
|
||||||
x64 support.
|
x64 support.
|
||||||
|
|
||||||
|
v1.31, 13 November, 2010:
|
||||||
|
use LLW to fix potential Unicode path problems.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PVERS "1.30"
|
#define PVERS "1.31"
|
||||||
#define PDATE "7 September, 2010"
|
#define PDATE "13 November, 2010"
|
||||||
|
|
||||||
#define UNICODE
|
#define UNICODE
|
||||||
#define _UNICODE
|
#define _UNICODE
|
||||||
@ -57,6 +60,8 @@
|
|||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include "injdll.h"
|
#include "injdll.h"
|
||||||
|
|
||||||
|
#define lenof(str) (sizeof(str)/sizeof(TCHAR))
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
#ifdef __MINGW32__
|
||||||
int _CRT_glob = 0;
|
int _CRT_glob = 0;
|
||||||
#endif
|
#endif
|
||||||
@ -64,10 +69,10 @@ int _CRT_glob = 0;
|
|||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
# define InjectDLL InjectDLL64
|
# define InjectDLL InjectDLL64
|
||||||
# define BITS "64"
|
# define BITS L"64"
|
||||||
#else
|
#else
|
||||||
# define InjectDLL InjectDLL32
|
# define InjectDLL InjectDLL32
|
||||||
# define BITS "32"
|
# define BITS L"32"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -91,12 +96,12 @@ BOOL GetParentProcessInfo( LPPROCESS_INFORMATION ppi );
|
|||||||
void Inject( LPPROCESS_INFORMATION ppi )
|
void Inject( LPPROCESS_INFORMATION ppi )
|
||||||
{
|
{
|
||||||
DWORD len;
|
DWORD len;
|
||||||
CHAR dll[MAX_PATH];
|
WCHAR dll[MAX_PATH];
|
||||||
|
|
||||||
len = GetModuleFileNameA( NULL, dll, sizeof(dll) );
|
len = GetModuleFileName( NULL, dll, lenof(dll) );
|
||||||
while (dll[len-1] != '\\')
|
while (dll[len-1] != '\\')
|
||||||
--len;
|
--len;
|
||||||
lstrcpyA( dll + len, "ANSI" BITS ".dll" );
|
lstrcpy( dll + len, L"ANSI" BITS L".dll" );
|
||||||
|
|
||||||
InjectDLL( ppi, dll );
|
InjectDLL( ppi, dll );
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#include <winver.h>
|
#include <winver.h>
|
||||||
|
|
||||||
1 VERSIONINFO
|
1 VERSIONINFO
|
||||||
FILEVERSION 1,3,0,0
|
FILEVERSION 1,3,1,0
|
||||||
PRODUCTVERSION 1,3,0,0
|
PRODUCTVERSION 1,3,1,0
|
||||||
FILEOS VOS_NT
|
FILEOS VOS_NT
|
||||||
FILETYPE VFT_APP
|
FILETYPE VFT_APP
|
||||||
{
|
{
|
||||||
@ -19,12 +19,12 @@ FILETYPE VFT_APP
|
|||||||
VALUE "Comments", "http://ansicon.adoxa.cjb.net/"
|
VALUE "Comments", "http://ansicon.adoxa.cjb.net/"
|
||||||
VALUE "CompanyName", "Jason Hood"
|
VALUE "CompanyName", "Jason Hood"
|
||||||
VALUE "FileDescription", "ANSI Console"
|
VALUE "FileDescription", "ANSI Console"
|
||||||
VALUE "FileVersion", "1.30"
|
VALUE "FileVersion", "1.31"
|
||||||
VALUE "InternalName", "ansicon"
|
VALUE "InternalName", "ansicon"
|
||||||
VALUE "LegalCopyright", "Freeware"
|
VALUE "LegalCopyright", "Freeware"
|
||||||
VALUE "OriginalFilename", "ansicon.exe"
|
VALUE "OriginalFilename", "ansicon.exe"
|
||||||
VALUE "ProductName", "ANSICON"
|
VALUE "ProductName", "ANSICON"
|
||||||
VALUE "ProductVersion", "1.30"
|
VALUE "ProductVersion", "1.31"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
injdll.h
4
injdll.h
@ -10,7 +10,7 @@
|
|||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
void InjectDLL32( LPPROCESS_INFORMATION, LPCSTR );
|
void InjectDLL32( LPPROCESS_INFORMATION, LPCWSTR );
|
||||||
void InjectDLL64( LPPROCESS_INFORMATION, LPCSTR );
|
void InjectDLL64( LPPROCESS_INFORMATION, LPCWSTR );
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
28
injdll32.c
28
injdll32.c
@ -31,23 +31,24 @@ TWow64SetThreadContext Wow64SetThreadContext;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
DWORD LLA;
|
DWORD LLW;
|
||||||
|
|
||||||
|
|
||||||
void InjectDLL32( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
void InjectDLL32( LPPROCESS_INFORMATION ppi, LPCWSTR dll )
|
||||||
{
|
{
|
||||||
CONTEXT context;
|
CONTEXT context;
|
||||||
DWORD len;
|
DWORD len;
|
||||||
LPVOID mem;
|
LPVOID mem;
|
||||||
DWORD mem32;
|
DWORD mem32;
|
||||||
#define CODESIZE 20
|
#define CODESIZE 20
|
||||||
BYTE code[CODESIZE+MAX_PATH];
|
BYTE code[CODESIZE+MAX_PATH*sizeof(WCHAR)];
|
||||||
|
|
||||||
len = lstrlenA( dll ) + 1;
|
len = lstrlenW( dll ) + 1;
|
||||||
if (len > MAX_PATH)
|
if (len > MAX_PATH)
|
||||||
return;
|
return;
|
||||||
|
len *= sizeof(WCHAR);
|
||||||
|
|
||||||
if (LLA == 0)
|
if (LLW == 0)
|
||||||
{
|
{
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
extern HMODULE hKernel;
|
extern HMODULE hKernel;
|
||||||
@ -62,18 +63,19 @@ void InjectDLL32( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
|||||||
PROCESS_INFORMATION pi;
|
PROCESS_INFORMATION pi;
|
||||||
ZeroMemory( &si, sizeof(si) );
|
ZeroMemory( &si, sizeof(si) );
|
||||||
si.cb = sizeof(si);
|
si.cb = sizeof(si);
|
||||||
CopyMemory( code, dll, len - 7 ); // ...ANSI32.dll\0
|
// ...ANSI32.dll\0
|
||||||
CopyMemory( code + len - 7, "-LLA.exe", 9 ); // ...ANSI-LLA.exe\0
|
CopyMemory( code, dll, len - 7*sizeof(WCHAR) );
|
||||||
|
// ...ANSI-LLA.exe\0
|
||||||
|
CopyMemory( code + len - 7*sizeof(WCHAR), L"-LLA.exe", 9*sizeof(WCHAR) );
|
||||||
if (!CreateProcess( (char*)code, NULL, NULL, NULL, FALSE, 0, NULL, NULL,
|
if (!CreateProcess( (char*)code, NULL, NULL, NULL, FALSE, 0, NULL, NULL,
|
||||||
&si, &pi ))
|
&si, &pi ))
|
||||||
return;
|
return;
|
||||||
WaitForSingleObject( pi.hProcess, INFINITE );
|
WaitForSingleObject( pi.hProcess, INFINITE );
|
||||||
GetExitCodeProcess( pi.hProcess, &LLA );
|
GetExitCodeProcess( pi.hProcess, &LLW );
|
||||||
CloseHandle( pi.hProcess );
|
CloseHandle( pi.hProcess );
|
||||||
CloseHandle( pi.hThread );
|
CloseHandle( pi.hThread );
|
||||||
#else
|
#else
|
||||||
LLA = (DWORD)GetProcAddress( GetModuleHandleA( "kernel32.dll" ),
|
LLW = (DWORD)LoadLibraryW;
|
||||||
"LoadLibraryA" );
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,10 +99,10 @@ void InjectDLL32( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
|||||||
*ip.pL++ = context.Eip;
|
*ip.pL++ = context.Eip;
|
||||||
*ip.pB++ = 0x9c; // pushf
|
*ip.pB++ = 0x9c; // pushf
|
||||||
*ip.pB++ = 0x60; // pusha
|
*ip.pB++ = 0x60; // pusha
|
||||||
*ip.pB++ = 0x68; // push "path\to\ANSI32.dll"
|
*ip.pB++ = 0x68; // push L"path\to\ANSI32.dll"
|
||||||
*ip.pL++ = mem32 + CODESIZE;
|
*ip.pL++ = mem32 + CODESIZE;
|
||||||
*ip.pB++ = 0xe8; // call LoadLibraryA
|
*ip.pB++ = 0xe8; // call LoadLibraryW
|
||||||
*ip.pL++ = LLA - (mem32 + (ip.pB+4 - code));
|
*ip.pL++ = LLW - (mem32 + (ip.pB+4 - code));
|
||||||
*ip.pB++ = 0x61; // popa
|
*ip.pB++ = 0x61; // popa
|
||||||
*ip.pB++ = 0x9d; // popf
|
*ip.pB++ = 0x9d; // popf
|
||||||
*ip.pB++ = 0xc3; // ret
|
*ip.pB++ = 0xc3; // ret
|
||||||
|
20
injdll64.c
20
injdll64.c
@ -18,16 +18,16 @@
|
|||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
void InjectDLL64( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
void InjectDLL64( LPPROCESS_INFORMATION ppi, LPCWSTR dll )
|
||||||
{
|
{
|
||||||
CONTEXT context;
|
CONTEXT context;
|
||||||
DWORD len;
|
DWORD len;
|
||||||
LPVOID mem;
|
LPVOID mem;
|
||||||
DWORD64 LLA;
|
DWORD64 LLW;
|
||||||
#define CODESIZE 92
|
#define CODESIZE 92
|
||||||
static BYTE code[CODESIZE+MAX_PATH] = {
|
static BYTE code[CODESIZE+MAX_PATH] = {
|
||||||
0,0,0,0,0,0,0,0, // original rip
|
0,0,0,0,0,0,0,0, // original rip
|
||||||
0,0,0,0,0,0,0,0, // LoadLibraryA
|
0,0,0,0,0,0,0,0, // LoadLibraryW
|
||||||
0x9C, // pushfq
|
0x9C, // pushfq
|
||||||
0x50, // push rax
|
0x50, // push rax
|
||||||
0x51, // push rcx
|
0x51, // push rcx
|
||||||
@ -45,8 +45,8 @@ void InjectDLL64( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
|||||||
0x41,0x56, // push r14
|
0x41,0x56, // push r14
|
||||||
0x41,0x57, // push r15
|
0x41,0x57, // push r15
|
||||||
0x48,0x83,0xEC,0x28, // sub rsp, 40
|
0x48,0x83,0xEC,0x28, // sub rsp, 40
|
||||||
0x48,0x8D,0x0D,41,0,0,0, // lea ecx, "path\to\ANSI.dll"
|
0x48,0x8D,0x0D,41,0,0,0, // lea ecx, L"path\to\ANSI.dll"
|
||||||
0xFF,0x15,-49,-1,-1,-1, // call LoadLibraryA
|
0xFF,0x15,-49,-1,-1,-1, // call LoadLibraryW
|
||||||
0x48,0x83,0xC4,0x28, // add rsp, 40
|
0x48,0x83,0xC4,0x28, // add rsp, 40
|
||||||
0x41,0x5F, // pop r15
|
0x41,0x5F, // pop r15
|
||||||
0x41,0x5E, // pop r14
|
0x41,0x5E, // pop r14
|
||||||
@ -65,12 +65,13 @@ void InjectDLL64( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
|||||||
0x58, // pop rax
|
0x58, // pop rax
|
||||||
0x9D, // popfq
|
0x9D, // popfq
|
||||||
0xFF,0x25,-91,-1,-1,-1, // jmp original Rip
|
0xFF,0x25,-91,-1,-1,-1, // jmp original Rip
|
||||||
0, // dword alignment for LLA, fwiw
|
0, // dword alignment for LLW, fwiw
|
||||||
};
|
};
|
||||||
|
|
||||||
len = lstrlenA( dll ) + 1;
|
len = lstrlenW( dll ) + 1;
|
||||||
if (len > MAX_PATH)
|
if (len > MAX_PATH)
|
||||||
return;
|
return;
|
||||||
|
len *= sizeof(WCHAR);
|
||||||
CopyMemory( code + CODESIZE, dll, len );
|
CopyMemory( code + CODESIZE, dll, len );
|
||||||
len += CODESIZE;
|
len += CODESIZE;
|
||||||
|
|
||||||
@ -78,8 +79,7 @@ void InjectDLL64( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
|||||||
GetThreadContext( ppi->hThread, &context );
|
GetThreadContext( ppi->hThread, &context );
|
||||||
mem = VirtualAllocEx( ppi->hProcess, NULL, len, MEM_COMMIT,
|
mem = VirtualAllocEx( ppi->hProcess, NULL, len, MEM_COMMIT,
|
||||||
PAGE_EXECUTE_READWRITE );
|
PAGE_EXECUTE_READWRITE );
|
||||||
LLA = (DWORD64)GetProcAddress( GetModuleHandleA( "kernel32.dll" ),
|
LLW = (DWORD64)LoadLibraryW;
|
||||||
"LoadLibraryA" );
|
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
@ -89,7 +89,7 @@ void InjectDLL64( LPPROCESS_INFORMATION ppi, LPCSTR dll )
|
|||||||
ip.pB = code;
|
ip.pB = code;
|
||||||
|
|
||||||
*ip.pL++ = context.Rip;
|
*ip.pL++ = context.Rip;
|
||||||
*ip.pL++ = LLA;
|
*ip.pL++ = LLW;
|
||||||
|
|
||||||
WriteProcessMemory( ppi->hProcess, mem, code, len, NULL );
|
WriteProcessMemory( ppi->hProcess, mem, code, len, NULL );
|
||||||
FlushInstructionCache( ppi->hProcess, mem, len );
|
FlushInstructionCache( ppi->hProcess, mem, len );
|
||||||
|
17
makefile
17
makefile
@ -22,9 +22,12 @@ x64/%v.o: %.rc
|
|||||||
|
|
||||||
all: ansicon32 ansicon64
|
all: ansicon32 ansicon64
|
||||||
|
|
||||||
ansicon32: x86/ansicon.exe x86/ANSI32.dll
|
ansicon32: x86 x86/ansicon.exe x86/ANSI32.dll
|
||||||
|
|
||||||
ansicon64: x64/ansicon.exe x64/ANSI64.dll x64/ANSI32.dll x64/ANSI-LLA.exe
|
ansicon64: x64 x64/ansicon.exe x64/ANSI64.dll x64/ANSI32.dll x64/ANSI-LLW.exe
|
||||||
|
|
||||||
|
x86:
|
||||||
|
mkdir x86
|
||||||
|
|
||||||
x86/ansicon.exe: x86/ansicon.o x86/injdll32.o x86/ansiconv.o
|
x86/ansicon.exe: x86/ansicon.o x86/injdll32.o x86/ansiconv.o
|
||||||
$(CC) -m32 $+ -s -o $@
|
$(CC) -m32 $+ -s -o $@
|
||||||
@ -32,6 +35,9 @@ x86/ansicon.exe: x86/ansicon.o x86/injdll32.o x86/ansiconv.o
|
|||||||
x86/ANSI32.dll: x86/ANSI.o x86/injdll32.o x86/ansiv.o
|
x86/ANSI32.dll: x86/ANSI.o x86/injdll32.o x86/ansiv.o
|
||||||
$(CC) -m32 $+ -s -o $@ -mdll -Wl,-shared
|
$(CC) -m32 $+ -s -o $@ -mdll -Wl,-shared
|
||||||
|
|
||||||
|
x64:
|
||||||
|
mkdir x64
|
||||||
|
|
||||||
x64/ansicon.exe: x64/ansicon.o x64/injdll64.o x64/ansiconv.o
|
x64/ansicon.exe: x64/ansicon.o x64/injdll64.o x64/ansiconv.o
|
||||||
$(CC) $+ -s -o $@
|
$(CC) $+ -s -o $@
|
||||||
|
|
||||||
@ -39,9 +45,9 @@ x64/ANSI64.dll: x64/ANSI.o x64/injdll64.o x64/injdll32.o x64/ansiv.o
|
|||||||
$(CC) $+ -s -o $@ -mdll -Wl,-shared
|
$(CC) $+ -s -o $@ -mdll -Wl,-shared
|
||||||
|
|
||||||
x64/ANSI32.dll: x86/ANSI32.dll
|
x64/ANSI32.dll: x86/ANSI32.dll
|
||||||
cmd /c copy x86\ANSI32.dll x64\ANSI32.dll
|
cp -p x86/ANSI32.dll x64/ANSI32.dll
|
||||||
|
|
||||||
x64/ANSI-LLA.exe: ANSI-LLA.c
|
x64/ANSI-LLW.exe: ANSI-LLW.c
|
||||||
$(CC) -m32 $(CFLAGS) $< -s -o $@
|
$(CC) -m32 $(CFLAGS) $< -s -o $@
|
||||||
|
|
||||||
x86/ansiconv.o: ansicon.rc
|
x86/ansiconv.o: ansicon.rc
|
||||||
@ -50,4 +56,5 @@ x64/ansiconv.o: ansicon.rc
|
|||||||
x64/ansiv.o: ansi.rc
|
x64/ansiv.o: ansi.rc
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-cmd /c "del x86\*.o x64\*.o"
|
-rm x86/*.o
|
||||||
|
-rm x64/*.o
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
Copyright 2005-2010 Jason Hood
|
Copyright 2005-2010 Jason Hood
|
||||||
|
|
||||||
Version 1.30. Freeware
|
Version 1.31. Freeware
|
||||||
|
|
||||||
|
|
||||||
===========
|
===========
|
||||||
@ -39,6 +39,7 @@
|
|||||||
---------
|
---------
|
||||||
|
|
||||||
Delete ANSI.dll, it has been replaced with ANSI32.dll.
|
Delete ANSI.dll, it has been replaced with ANSI32.dll.
|
||||||
|
Delete ANSI-LLA.dll, it has been replaced with ANSI-LLW.dll.
|
||||||
|
|
||||||
|
|
||||||
=====
|
=====
|
||||||
@ -121,6 +122,10 @@
|
|||||||
|
|
||||||
Legend: + added, - bug-fixed, * changed.
|
Legend: + added, - bug-fixed, * changed.
|
||||||
|
|
||||||
|
1.31 - 13 November, 2010:
|
||||||
|
- fixed multibyte support (no extra junk with UTF-8 files);
|
||||||
|
* fixed potential problem if install path uses Unicode.
|
||||||
|
|
||||||
1.30 - 7 September, 2010:
|
1.30 - 7 September, 2010:
|
||||||
+ x64 version.
|
+ x64 version.
|
||||||
|
|
||||||
@ -233,4 +238,4 @@
|
|||||||
|
|
||||||
|
|
||||||
==============================
|
==============================
|
||||||
Jason Hood, 7 September, 2010.
|
Jason Hood, 13 November, 2010.
|
||||||
|
BIN
x64/ANSI-LLA.exe
BIN
x64/ANSI-LLA.exe
Binary file not shown.
BIN
x64/ANSI32.dll
BIN
x64/ANSI32.dll
Binary file not shown.
BIN
x64/ANSI64.dll
BIN
x64/ANSI64.dll
Binary file not shown.
BIN
x64/ansicon.exe
BIN
x64/ansicon.exe
Binary file not shown.
BIN
x86/ANSI32.dll
BIN
x86/ANSI32.dll
Binary file not shown.
BIN
x86/ansicon.exe
BIN
x86/ansicon.exe
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user