Files
mirror-processhacker/2.x/trunk/ProcessHacker/support.c
T
wj32 b167adb64a * added file verification code
* added copyright headers

git-svn-id: svn://svn.code.sf.net/p/processhacker/code@2554 21ef857c-d57f-4fe0-8362-d861dc6d29cd
2009-12-31 11:45:30 +00:00

282 lines
5.9 KiB
C

/*
* Process Hacker -
* general support functions
*
* Copyright (C) 2009-2010 wj32
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see <http://www.gnu.org/licenses/>.
*/
#include <phgui.h>
#include <wchar.h>
INT PhShowMessage(
__in HWND hWnd,
__in ULONG Type,
__in PWSTR Format,
...
)
{
va_list argptr;
va_start(argptr, Format);
return PhShowMessage_V(hWnd, Type, Format, argptr);
}
INT PhShowMessage_V(
__in HWND hWnd,
__in ULONG Type,
__in PWSTR Format,
__in va_list ArgPtr
)
{
INT result;
WCHAR message[PH_MAX_MESSAGE_SIZE + 1];
result = _vsnwprintf(message, PH_MAX_MESSAGE_SIZE, Format, ArgPtr);
if (result == -1)
return -1;
return MessageBox(hWnd, message, PH_APP_NAME, Type);
}
PVOID PhGetFileVersionInfo(
__in PWSTR FileName
)
{
ULONG versionInfoSize;
ULONG dummy;
PVOID versionInfo;
versionInfoSize = GetFileVersionInfoSize(
FileName,
&dummy
);
if (versionInfoSize)
{
versionInfo = PhAllocate(versionInfoSize);
if (!GetFileVersionInfo(
FileName,
0,
versionInfoSize,
versionInfo
))
{
PhFree(versionInfo);
return NULL;
}
}
else
{
return NULL;
}
return versionInfo;
}
ULONG PhGetFileVersionInfoLangCodePage(
__in PVOID VersionInfo
)
{
PVOID buffer;
ULONG length;
if (VerQueryValue(VersionInfo, L"\\VarFileInfo\\Translation", &buffer, &length))
{
// Combine the language ID and code page.
return (*(PUSHORT)buffer << 16) + *((PUSHORT)buffer + 1);
}
else
{
return 0x40904e4;
}
}
PPH_STRING PhGetFileVersionInfoString(
__in PVOID VersionInfo,
__in PWSTR SubBlock
)
{
PVOID buffer;
ULONG length;
if (VerQueryValue(VersionInfo, SubBlock, &buffer, &length))
{
return PhCreateStringEx((PWSTR)buffer, length * sizeof(WCHAR));
}
else
{
return NULL;
}
}
PPH_STRING PhGetFileVersionInfoString2(
__in PVOID VersionInfo,
__in ULONG LangCodePage,
__in PWSTR StringName
)
{
WCHAR subBlock[65];
_snwprintf(subBlock, 64, L"\\StringFileInfo\\%08X\\%s", LangCodePage, StringName);
return PhGetFileVersionInfoString(VersionInfo, subBlock);
}
PPH_STRING PhGetFullPath(
__in PWSTR FileName,
__out_opt PULONG IndexOfFileName
)
{
PPH_STRING fullPath;
PVOID buffer;
ULONG bufferSize;
ULONG returnLength;
PWSTR filePart;
bufferSize = 0x80;
buffer = PhAllocate(bufferSize * 2);
returnLength = GetFullPathName(FileName, bufferSize, buffer, &filePart);
if (returnLength > bufferSize)
{
PhFree(buffer);
bufferSize = returnLength;
buffer = PhAllocate(bufferSize * 2);
returnLength = GetFullPathName(FileName, bufferSize, buffer, &filePart);
}
if (returnLength == 0)
{
PhFree(buffer);
return NULL;
}
fullPath = PhCreateString(buffer);
if (IndexOfFileName)
{
*IndexOfFileName = (ULONG)(filePart - (PWSTR)buffer);
}
PhFree(buffer);
return fullPath;
}
PPH_STRING PhGetSystemDirectory()
{
PPH_STRING systemDirectory;
PVOID buffer;
ULONG bufferSize;
ULONG returnLength;
bufferSize = 0x40;
buffer = PhAllocate(bufferSize * 2);
returnLength = GetSystemDirectory(buffer, bufferSize);
if (returnLength > bufferSize)
{
PhFree(buffer);
bufferSize = returnLength;
buffer = PhAllocate(bufferSize * 2);
returnLength = GetSystemDirectory(buffer, bufferSize);
}
if (returnLength == 0)
{
PhFree(buffer);
return NULL;
}
systemDirectory = PhCreateString(buffer);
PhFree(buffer);
return systemDirectory;
}
PPH_STRING PhpGetApplicationFileName(
__out_opt PULONG IndexOfFileName
)
{
PPH_STRING fileName;
PVOID buffer;
ULONG bufferSize;
ULONG returnLength;
bufferSize = 0x40;
buffer = PhAllocate(bufferSize * 2);
while (TRUE)
{
returnLength = GetModuleFileName(GetModuleHandle(NULL), buffer, bufferSize);
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
PhFree(buffer);
bufferSize *= 2;
buffer = PhAllocate(bufferSize);
}
else
{
break;
}
}
if (returnLength == 0)
{
PhFree(buffer);
return NULL;
}
fileName = PhGetFullPath((PWSTR)buffer, IndexOfFileName);
PhFree(buffer);
return fileName;
}
PPH_STRING PhGetApplicationFileName()
{
return PhpGetApplicationFileName(NULL);
}
PPH_STRING PhGetApplicationDirectory()
{
PPH_STRING fileName;
ULONG indexOfFileName;
PPH_STRING path = NULL;
fileName = PhpGetApplicationFileName(&indexOfFileName);
if (fileName)
{
// Remove the file name from the path.
path = PhSubstring(fileName, 0, indexOfFileName);
PhDereferenceObject(fileName);
}
return path;
}