- 2009년 말부터 지금까지 많은 일들이 있었습니다. 다니던 회사도 옮기게 되었고, 새 회사로 오고 나서도 우여곡절이 많았습니다. 다행히 프로젝트를 매우 체계적으로 진행하는 곳에서 일을 할 수 있게 되었습니다.
- 그 무엇보다도 소프트웨어 개발팀은 팀장이 매우 중요하다는 것을 몸소 체험할 수 있었습니다.
TAG 근황


typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
void GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
{
KeQuerySystemTime((PLARGE_INTEGER)&lpSystemTimeAsFileTime);
}typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
void GetSystemTime(LPSYSTEMTIME lpSystemTime)
{
LARGE_INTEGER systemTime;
TIME_FIELDS timeFields;
KeQuerySystemTime(&systemTime);
RtlTimeToTimeFields(&systemTime, &timeFields);
}#include <time.h>
errno_t localtime_s(struct tm * _Tm, const time_t * _Time)
{
LARGE_INTEGER systemTime, localTime;
TIME_FIELDS timeFields;
KeQuerySystemTime(&systemTime);
ExSystemTimeToLocalTime(&systemTime, &localTime);
RtlTimeToTimeFields(&localTime, &timeFields);
_Tm->tm_sec = timeFields.Second;
_Tm->tm_min = timeFields.Minute;
_Tm->tm_hour = timeFields.Hour;
_Tm->tm_mday = timeFields.Day;
_Tm->tm_mon = timeFields.Month;
_Tm->tm_year = timeFields.Year;
_Tm->tm_wday = timeFields.Weekday;
return 0;
}HANDLE
CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
LPCWSTR lpName)
{
LARGE_INTEGER timeOut = {0, };
PRKMUTEX mutex = ExAllocatePoolWithTag(NonPagedPool, sizeof(KMUTEX), 'xtum');
KeInitializeMutex(mutex, 0);
if (bInitialOwner == TRUE)
KeWaitForSingleObject(mutex, Executive, KernelMode, FALSE, &timeOut);
return (HANDLE)mutex;
}HANDLE
CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCSTR lpName)
{
PRKSEMAPHORE semaphore =
ExAllocatePoolWithTag(NonPagedPool, sizeof(KSEMAPHORE), 'ames');
KeInitializeSemaphore(semaphore, lInitialCount, lMaximumCount);
return (HANDLE)semaphore;
}BOOL
CloseHandle(
HANDLE hObject)
{
if (MmIsAddressValid(hObject) == TRUE)
ExFreePool(hObject);
else
ZwClose(hObject);
return TRUE;
}DWORD
WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds)
{
NTSTATUS status;
LARGE_INTEGER timeOut;
LONG milliseconds = dwMilliseconds;
DWORD ret;
timeOut.QuadPart = -(milliseconds * 10000);
if (dwMilliseconds == INFINITE)
status = KeWaitForSingleObject(hHandle, Executive, KernelMode, FALSE, NULL);
else
status = KeWaitForSingleObject(hHandle, Executive, KernelMode, FALSE, &timeOut);
switch (status)
{
case STATUS_SUCCESS:
ret = WAIT_OBJECT_0;
break;
case STATUS_TIMEOUT:
ret = WAIT_TIMEOUT;
break;
case STATUS_ABANDONED_WAIT_0:
ret = WAIT_ABANDONED;
break;
default:
ret = WAIT_FAILED;
}
return 0;
}typedef struct _CRITICAL_SECTION {
ERESOURCE Resource;
} CRITICAL_SECTION, *LPCRITICAL_SECTION;
VOID
InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection)
{
ExInitializeResourceLite(&lpCriticalSection->Resource);
}
VOID
EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection)
{
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&lpCriticalSection->Resource, TRUE);
}
VOID
LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection)
{
ExReleaseResourceLite(&lpCriticalSection->Resource);
KeLeaveCriticalRegion();
}
VOID
DeleteCriticalSection(
LPCRITICAL_SECTION lpCriticalSection)
{
ExDeleteResourceLite(&lpCriticalSection->Resource);
}HANDLE
CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPCSTR lpName)
{
EVENT_TYPE eventType;
PRKEVENT event = ExAllocatePoolWithTag(NonPagedPool, sizeof(KEVENT), 'tnve');
if (bManualReset == TRUE)
eventType = NotificationEvent;
else
eventType = SynchronizationEvent;
KeInitializeEvent(event, eventType, bInitialState);
return (HANDLE)event;
}
BOOL
SetEvent(
HANDLE hEvent)
{
KeSetEvent(hEvent, IO_NO_INCREMENT, FALSE);
return TRUE;
}
BOOL
ResetEvent(
HANDLE hEvent)
{
KeResetEvent(hEvent);
return TRUE;
}
BOOL
PulseEvent(
HANDLE hEvent)
{
KePulseEvent(hEvent, IO_NO_INCREMENT, FALSE);
return TRUE;
}void *malloc(size_t _Size)
{
POOL_TYPE poolType;
void *mem;
if (KeGetCurrentIrql() <= DISPATCH_LEVEL)
poolType = NonPagedPool;
else
poolType = PagedPool;
mem = ExAllocatePoolWithTag(poolType, _Size, 'llam');
return mem;
}void free(void *_Memory)
{
ExFreePool(_Memory);
}void *realloc(void *_Memory, size_t _NewSize)
{
POOL_TYPE poolType;
void *mem;
if (KeGetCurrentIrql() <= DISPATCH_LEVEL)
poolType = NonPagedPool;
else
poolType = PagedPool;
mem = ExAllocatePoolWithTag(poolType, _NewSize, 'laer');
if (_Memory != NULL)
{
RtlCopyMemory(mem, _Memory, _NewSize);
ExFreePool(_Memory);
}
return mem;
}void *calloc(size_t _NumOfElements, size_t _SizeOfElements)
{
POOL_TYPE poolType;
void *mem;
if (KeGetCurrentIrql() <= DISPATCH_LEVEL)
poolType = NonPagedPool;
else
poolType = PagedPool;
mem = ExAllocatePoolWithTag(poolType, _NumOfElements * _SizeOfElements, 'llac');
RtlZeroMemory(mem, _NumOfElements * _SizeOfElements);
return mem;
}DWORD GetFileSize(
HANDLE hFile,
LPDWARD lpFileSizeHigh)
{
NTSTATUS status;
IO_STATUS_BLOCK iosb;
FILE_STANDARD_INFORMATION fileStandardInfo;
DWORD fileSize = 0;
status = ZwQueryInformationFile(
hFile,
&iosb,
&fileStandardInfo,
sizeof(fileStandardInfo),
FileStandardInformation);
if (NT_SUCCESS(status))
{
*lpFileSizeHigh = fileStandardInfo.EndOfFile.HighPart;
fileSize = fileStandardInfo.EndOfFile.LowPart;
}
return fileSize;
}DWORD SetFilePointer(
HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod)
{
NTSTATUS status;
IO_STATUS_BLOCK iosb;
FILE_POSITION_INFORMATION filePositionInfo;
FILE_END_OF_FILE_INFORMATION fileEndOfFileInfo;
DWORD ret = INVALID_SET_FILE_POINTER;
switch (dwMoveMethod)
{
case FILE_BEGIN:
filePositionInfo.CurrentByteOffset.HighPart = *lpDistanceToMoveHigh;
filePositionInfo.CurrentByteOffset.LowPart = lDistanceToMove;
status = ZwSetInformationFile(
hFile,
&iosb,
&filePositionInfo,
sizeof(filePositionInfo),
FilePositionInformation);
break;
case FILE_CURRENT:
status = ZwQueryInformationFile(
hFile,
&iosb,
&filePositionInfo,
sizeof(filePositionInfo),
FilePositionInformation);
if (NT_SUCCESS(status))
{
filePositionInfo.CurrentByteOffset.HighPart += *lpDistanceToMoveHigh;
filePositionInfo.CurrentByteOffset.LowPart += lDistanceToMove;
status = ZwSetInformationFile(
hFile,
&iosb,
&filePositionInfo,
sizeof(filePositionInfo),
FilePositionInformation);
}
break;
case FILE_END:
status = ZwQueryInformationFile(
hFile,
&iosb,
&fileEndOfFileInfo,
sizeof(fileEndOfFileInfo),
FileEndOfFileInformation);
if (NT_SUCCESS(status))
{
filePositionInfo.CurrentByteOffset.HighPart =
fileEndOfFileInfo.EndOfFile.HighPart;
filePositionInfo.CurrentByteOffset.LowPart =
fileEndOfFileInfo.EndOfFile.LowPart;
filePositionInfo.CurrentByteOffset.HighPart += *lpDistanceToMoveHigh;
filePositionInfo.CurrentByteOffset.LowPart += lDistanceToMove;
status = ZwSetInformationFile(
hFile,
&iosb,
&filePositionInfo,
sizeof(filePositionInfo),
FilePositionInformation);
}
break;
}
if (NT_SUCCESS(status))
{
status = ZwQueryInformationFile(
hFile,
&iosb,
&filePositionInfo,
sizeof(filePositionInfo),
FilePositionInformation);
if (NT_SUCCESS(status))
{
*lpDistanceToMoveHigh = filePositionInfo.CurrentByteOffset.HighPart;
ret = filePositionInfo.CurrentByteOffset.LowPart;
}
}
return ret;
}DWORD GetFileAttributes(
LPCTSTR lpFileName)
{
NTSTATUS status;
HANDLE fileHandle;
UNICODE_STRING fileName;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK iosb;
FILE_ATTRIBUTE_TAG_INFORMATION fileAttributeTagInfo;
DWORD ret = INVALID_FILE_ATTRIBUTES;
RtlInitUnicodeString(&fileName, lpFileName);
InitializeObjectAttributes(
&objectAttributes,
&fileName,
OBJ_CASE_INSENSITIVE| OBJ_KERNEL_HANDLE,
NULL,
NULL);
status = ZwOpenFile(
&fileHandle,
FILE_ALL_ACCESS,
&objectAttributes,
&iosb,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN);
if (NT_SUCCESS(status))
{
status = ZwQueryInformationFile(
fileHandle,
&iosb,
&fileAttributeTagInfo,
sizeof(fileAttributeTagInfo),
FileAttributeTagInformation);
ret = fileAttributeTagInfo.FileAttributes;
ZwClose(fileHandle);
}
return ret;
}TARGETNAME=libcompat
TARGETTYPE=LIBRARY
SOURCES= \
io.c \
sync.c \
time.c \
memory.cTARGETLIBS=..\libcompat\objchk\i386\libcompat.lib#include "compat.h"
HANDLE
CreateFileW(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
)
{
... 생략 ...
ZwCreateFile( );
... 생략 ...
}
BOOL
ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
)
{
... 생략 ...
ZwReadFile( );
... 생략 ...
}#include <ntddk.h>
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
#define MAX_PATH 260#define CreateFileW(a,b,c,d,e,f,g) 0
#define SetFilePointer(a,b,c,d) 0/* 매개 변수는 int */
#define ExampleFunctionA(a) *a = 0
/* 매개 변수는 LARGE_INTEGER, 이후 LowPart만 사용한다고 했을 때 */
#define QueryPerformanceCounter(a) *a.LowPart = 0
/* 매개 변수는 LARGE_INTEGER, 이후 LowPart, HighPart 모두 사용한다고 했을 때 */
#define QueryPerformanceCounter(a) *a.LowPart = 0;*a.HighPart = 0;__inline void GetSystemTimeAsFileTime(__out LPFILETIME lpSystemTimeAsFileTime)
{
}
댓글을 달아 주세요
재홍 씨,저 체려예요(skype小茶).정말 오래간만이에요~~
잘 지냈어요?
네. 잘 지냈어요. 요즘 너무 바쁘네염.. ㅋㅋ
요즘 들어 읽는 책을 보면 결국은 사람의 관계, 조직의 시스템이 중요성을 강조하는 걸 많이 보게 되네요. :|
네. 그렇죠. ㅎㅎ