OnlineChecks: fixed crash; fixed memory leaks; fixed headers;

git-svn-id: svn://svn.code.sf.net/p/processhacker/code@5628 21ef857c-d57f-4fe0-8362-d861dc6d29cd
This commit is contained in:
dmex
2014-04-11 00:55:20 +00:00
parent 79a9571110
commit f3ea29a135
3 changed files with 254 additions and 282 deletions
+73 -100
View File
@@ -1,9 +1,9 @@
/*
* Process Hacker Online Checks -
* main program
* Main Program
*
* Copyright (C) 2010-2013 wj32
* Copyright (C) 2013 dmex
* Copyright (C) 2012-2014 dmex
*
* This file is part of Process Hacker.
*
@@ -21,103 +21,16 @@
* along with Process Hacker. If not, see <http://www.gnu.org/licenses/>.
*/
#include <phdk.h>
#include "onlnchk.h"
#include "resource.h"
VOID NTAPI LoadCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
);
VOID NTAPI ShowOptionsCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
);
VOID NTAPI MenuItemCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
);
VOID NTAPI ProcessMenuInitializingCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
);
VOID NTAPI ModuleMenuInitializingCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
);
PPH_PLUGIN PluginInstance;
PH_CALLBACK_REGISTRATION PluginLoadCallbackRegistration;
PH_CALLBACK_REGISTRATION PluginShowOptionsCallbackRegistration;
PH_CALLBACK_REGISTRATION PluginMenuItemCallbackRegistration;
PH_CALLBACK_REGISTRATION ProcessMenuInitializingCallbackRegistration;
PH_CALLBACK_REGISTRATION ModuleMenuInitializingCallbackRegistration;
static PH_CALLBACK_REGISTRATION PluginLoadCallbackRegistration;
static PH_CALLBACK_REGISTRATION PluginShowOptionsCallbackRegistration;
static PH_CALLBACK_REGISTRATION PluginMenuItemCallbackRegistration;
static PH_CALLBACK_REGISTRATION ProcessMenuInitializingCallbackRegistration;
static PH_CALLBACK_REGISTRATION ModuleMenuInitializingCallbackRegistration;
LOGICAL DllMain(
_In_ HINSTANCE Instance,
_In_ ULONG Reason,
_Reserved_ PVOID Reserved
)
{
switch (Reason)
{
case DLL_PROCESS_ATTACH:
{
PPH_PLUGIN_INFORMATION info;
PluginInstance = PhRegisterPlugin(L"ProcessHacker.OnlineChecks", Instance, &info);
if (!PluginInstance)
return FALSE;
info->DisplayName = L"Online Checks";
info->Author = L"dmex & wj32";
info->Description = L"Allows files to be checked with online services.";
info->HasOptions = FALSE;
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackLoad),
LoadCallback,
NULL,
&PluginLoadCallbackRegistration
);
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackShowOptions),
ShowOptionsCallback,
NULL,
&PluginShowOptionsCallbackRegistration
);
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackMenuItem),
MenuItemCallback,
NULL,
&PluginMenuItemCallbackRegistration
);
PhRegisterCallback(
PhGetGeneralCallback(GeneralCallbackProcessMenuInitializing),
ProcessMenuInitializingCallback,
NULL,
&ProcessMenuInitializingCallbackRegistration
);
PhRegisterCallback(
PhGetGeneralCallback(GeneralCallbackModuleMenuInitializing),
ModuleMenuInitializingCallback,
NULL,
&ModuleMenuInitializingCallbackRegistration
);
}
break;
}
return TRUE;
}
VOID NTAPI LoadCallback(
static VOID NTAPI LoadCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
@@ -125,7 +38,7 @@ VOID NTAPI LoadCallback(
// Nothing
}
VOID NTAPI ShowOptionsCallback(
static VOID NTAPI ShowOptionsCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
@@ -133,7 +46,7 @@ VOID NTAPI ShowOptionsCallback(
// Nothing
}
VOID NTAPI MenuItemCallback(
static VOID NTAPI MenuItemCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
@@ -158,7 +71,7 @@ VOID NTAPI MenuItemCallback(
}
}
PPH_EMENU_ITEM CreateSendToMenu(
static PPH_EMENU_ITEM CreateSendToMenu(
_In_ PPH_EMENU_ITEM Parent,
_In_ PWSTR InsertAfter,
_In_ PPH_STRING FileName
@@ -186,7 +99,7 @@ PPH_EMENU_ITEM CreateSendToMenu(
return sendToMenu;
}
VOID NTAPI ProcessMenuInitializingCallback(
static VOID NTAPI ProcessMenuInitializingCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
@@ -210,7 +123,7 @@ VOID NTAPI ProcessMenuInitializingCallback(
}
}
VOID NTAPI ModuleMenuInitializingCallback(
static VOID NTAPI ModuleMenuInitializingCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
@@ -231,3 +144,63 @@ VOID NTAPI ModuleMenuInitializingCallback(
sendToMenu->Flags |= PH_EMENU_DISABLED;
}
}
LOGICAL DllMain(
_In_ HINSTANCE Instance,
_In_ ULONG Reason,
_Reserved_ PVOID Reserved
)
{
switch (Reason)
{
case DLL_PROCESS_ATTACH:
{
PPH_PLUGIN_INFORMATION info;
PluginInstance = PhRegisterPlugin(SETTING_PREFIX, Instance, &info);
if (!PluginInstance)
return FALSE;
info->DisplayName = L"Online Checks";
info->Author = L"dmex, wj32";
info->Description = L"Allows files to be checked with online services.";
info->Url = L"http://processhacker.sf.net/forums/viewtopic.php?f=18&t=1118";
info->HasOptions = FALSE;
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackLoad),
LoadCallback,
NULL,
&PluginLoadCallbackRegistration
);
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackShowOptions),
ShowOptionsCallback,
NULL,
&PluginShowOptionsCallbackRegistration
);
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackMenuItem),
MenuItemCallback,
NULL,
&PluginMenuItemCallbackRegistration
);
PhRegisterCallback(
PhGetGeneralCallback(GeneralCallbackProcessMenuInitializing),
ProcessMenuInitializingCallback,
NULL,
&ProcessMenuInitializingCallbackRegistration
);
PhRegisterCallback(
PhGetGeneralCallback(GeneralCallbackModuleMenuInitializing),
ModuleMenuInitializingCallback,
NULL,
&ModuleMenuInitializingCallbackRegistration
);
}
break;
}
return TRUE;
}
+35 -25
View File
@@ -1,28 +1,48 @@
/*
* Process Hacker Online Checks -
* Main Headers
*
* Copyright (C) 2010-2013 wj32
* Copyright (C) 2012-2014 dmex
*
* 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/>.
*/
#ifndef ONLNCHK_H
#define ONLNCHK_H
#pragma comment(lib, "OleAut32.lib")
#pragma comment(lib, "Winhttp.lib")
#define CINTERFACE
#define COBJMACROS
#include <windowsx.h>
#include <time.h>
#include <phdk.h>
#include <OleCtl.h>
#include <windowsx.h>
#include <winhttp.h>
#include <Netlistmgr.h>
#include <ShObjIdl.h>
#include "sha256.h"
#include "resource.h"
#define SETTING_PREFIX L"ProcessHacker.OnlineChecks"
#define HASH_SHA1 1
#define HASH_SHA256 2
#define UM_EXISTS (WM_APP + 1)
#define UM_LAUNCH (WM_APP + 2)
#define UM_ERROR (WM_APP + 3)
#define UM_EXISTS (WM_USER + 1)
#define UM_LAUNCH (WM_USER + 2)
#define UM_ERROR (WM_USER + 3)
#define Control_Visible(hWnd, visible) \
ShowWindow(hWnd, visible ? SW_SHOW : SW_HIDE);
@@ -30,7 +50,6 @@
typedef enum _PH_UPLOAD_SERVICE_STATE
{
PhUploadServiceDefault = 0,
PhUploadServiceChecking,
PhUploadServiceViewReport,
PhUploadServiceUploading,
@@ -50,24 +69,22 @@ typedef struct _SERVICE_INFO
typedef struct _UPLOAD_CONTEXT
{
PPH_STRING FileName;
PPH_STRING WindowFileName;
ULONG Service;
HWND DialogHandle;
HWND MessageHandle;
HWND StatusHandle;
HWND ProgressHandle;
HFONT MessageFont;
HINTERNET HttpHandle;
HINTERNET HttpHandle;
ULONG ErrorCode;
PPH_STRING ErrorMessage;
PPH_STRING ErrorStatusMessage;
ULONG TotalFileLength;
PH_UPLOAD_SERVICE_STATE UploadServiceState;
HANDLE FileHandle;
ULONG TotalFileLength;
PPH_STRING FileName;
PPH_STRING BaseFileName;
PPH_STRING WindowFileName;
PPH_STRING ObjectName;
PPH_STRING LaunchCommand;
} UPLOAD_CONTEXT, *PUPLOAD_CONTEXT;
@@ -85,11 +102,4 @@ VOID UploadToOnlineService(
_In_ ULONG Service
);
INT_PTR CALLBACK UploadDlgProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
#endif
+146 -157
View File
@@ -1,9 +1,9 @@
/*
* Process Hacker Online Checks -
* uploader
* Uploader Window
*
* Copyright (C) 2010-2013 wj32
* Copyright (C) 2013 dmex
* Copyright (C) 2012-2014 dmex
*
* This file is part of Process Hacker.
*
@@ -30,56 +30,6 @@ static SERVICE_INFO UploadServiceInfo[] =
{ UPLOAD_SERVICE_CIMA, L"camas.comodo.com", INTERNET_DEFAULT_HTTP_PORT, 0, L"/cgi-bin/submit", L"file" }
};
static PPH_STRING PhGetWinHttpMessage(
_In_ ULONG Result
)
{
return PhGetMessage(GetModuleHandle(L"winhttp.dll"), 0xb, GetUserDefaultLangID(), Result);
}
static NTSTATUS PhUploadToDialogThreadStart(
_In_ PVOID Parameter
)
{
BOOL result;
MSG message;
HWND dialogHandle;
PH_AUTO_POOL autoPool;
PUPLOAD_CONTEXT context = (PUPLOAD_CONTEXT)Parameter;
PhInitializeAutoPool(&autoPool);
dialogHandle = CreateDialogParam(
(HINSTANCE)PluginInstance->DllBase,
MAKEINTRESOURCE(IDD_PROGRESS),
PhMainWndHandle,
UploadDlgProc,
(LPARAM)Parameter
);
ShowWindow(dialogHandle, SW_SHOW);
SetForegroundWindow(dialogHandle);
while (result = GetMessage(&message, NULL, 0, 0))
{
if (result == -1)
break;
if (!IsDialogMessage(dialogHandle, &message))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
PhDrainAutoPool(&autoPool);
}
PhDeleteAutoPool(&autoPool);
DestroyWindow(dialogHandle);
PhFree(context);
return STATUS_SUCCESS;
}
static HFONT InitializeFont(
_In_ HWND hwndDlg
)
@@ -165,15 +115,14 @@ static VOID RaiseUploadError(
_In_ ULONG ErrorCode
)
{
PhSwapReference(&Context->ErrorMessage, NULL);
PhSwapReference(&Context->ErrorStatusMessage, NULL);
Context->ErrorMessage = PhFormatString(L"Error: [%u] %s", ErrorCode, Error);
Context->ErrorStatusMessage = PhGetWinHttpMessage(ErrorCode);
if (Context->DialogHandle)
{
PostMessage(Context->DialogHandle, UM_ERROR, 0, 0);
PostMessage(
Context->DialogHandle,
UM_ERROR,
0,
(LPARAM)PhFormatString(L"Error: [%u] %s", ErrorCode, Error)
);
}
}
@@ -376,7 +325,13 @@ static NTSTATUS HashFileAndResetPosition(
}
positionInfo.CurrentByteOffset.QuadPart = 0;
status = NtSetInformationFile(FileHandle, &iosb, &positionInfo, sizeof(FILE_POSITION_INFORMATION), FilePositionInformation);
status = NtSetInformationFile(
FileHandle,
&iosb,
&positionInfo,
sizeof(FILE_POSITION_INFORMATION),
FilePositionInformation
);
}
return status;
@@ -386,30 +341,33 @@ static NTSTATUS UploadFileThreadStart(
_In_ PVOID Parameter
)
{
time_t timeStart = 0;
time_t timeTransferred = 0;
NTSTATUS status = STATUS_SUCCESS;
ULONG httpStatus = 0;
ULONG httpStatusLength = sizeof(ULONG);
ULONG httpPostSeed = 0;
ULONG totalUploadLength = 0;
ULONG totalUploadedLength = 0;
ULONG totalPostHeaderWritten = 0;
ULONG totalPostFooterWritten = 0;
ULONG totalWriteLength = 0;
BYTE buffer[PAGE_SIZE];
ULONG totalWriteLength = 0;
LARGE_INTEGER timeNow;
LARGE_INTEGER timeStart;
ULONG64 timeTicks = 0;
ULONG64 timeBitsPerSecond = 0;
HANDLE fileHandle;
IO_STATUS_BLOCK isb;
NTSTATUS status = STATUS_SUCCESS;
PSERVICE_INFO serviceInfo = NULL;
ULONG httpStatus = 0;
ULONG httpStatusLength = sizeof(ULONG);
HINTERNET connectHandle = NULL;
HINTERNET requestHandle = NULL;
PPH_STRING postBoundary = NULL;
PPH_STRING postBoundary = NULL;
PPH_ANSI_STRING ansiPostData = NULL;
PPH_ANSI_STRING ansiFooterData = NULL;
PH_STRING_BUILDER httpRequestHeaders = { 0 };
PH_STRING_BUILDER httpPostHeader = { 0 };
PH_STRING_BUILDER httpPostFooter = { 0 };
BYTE buffer[PAGE_SIZE];
PUPLOAD_CONTEXT context = (PUPLOAD_CONTEXT)Parameter;
@@ -417,6 +375,23 @@ static NTSTATUS UploadFileThreadStart(
__try
{
// Open the file and check its size.
status = PhCreateFileWin32(
&fileHandle,
context->FileName->Buffer,
FILE_GENERIC_READ,
0,
FILE_SHARE_READ | FILE_SHARE_DELETE,
FILE_OPEN,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT
);
if (!NT_SUCCESS(status))
{
RaiseUploadError(context, L"Unable to open the file", RtlNtStatusToDosError(status));
__leave;
}
// Connect to the online service.
if (!(connectHandle = WinHttpConnect(
context->HttpHandle,
@@ -512,8 +487,7 @@ static NTSTATUS UploadFileThreadStart(
ansiFooterData = PhCreateAnsiStringFromUnicode(httpPostFooter.String->Buffer);
// Start the clock.
timeStart = time(NULL);
timeTransferred = timeStart;
PhQuerySystemTime(&timeStart);
// Write the header
if (!WinHttpWriteData(
@@ -531,12 +505,12 @@ static NTSTATUS UploadFileThreadStart(
while (TRUE)
{
status = NtReadFile(
context->FileHandle,
fileHandle,
NULL,
NULL,
NULL,
&isb,
&buffer,
buffer,
PAGE_SIZE,
NULL,
NULL
@@ -545,28 +519,24 @@ static NTSTATUS UploadFileThreadStart(
if (!NT_SUCCESS(status))
break;
// Check bytes read.
if (isb.Information == 0)
break;
if (!WinHttpWriteData(requestHandle, buffer, (ULONG)isb.Information, &totalWriteLength))
{
RaiseUploadError(context, L"Unable to upload the file data", GetLastError());
__leave;
}
// Zero our uploaded file buffer.
memset(buffer, 0, PAGE_SIZE);
totalUploadedLength += totalWriteLength;
{
time_t time_taken = (time(NULL) - timeTransferred);
time_t bps = totalUploadedLength / __max(time_taken, 1);
//time_t remain = (MulDiv((INT)time_taken, totalFileLength, totalFileReadLength) - time_taken);
PhQuerySystemTime(&timeNow);
timeTicks = (timeNow.QuadPart - timeStart.QuadPart) / PH_TICKS_PER_SEC;
timeBitsPerSecond = totalUploadedLength / __max(timeTicks, 1);
{
FLOAT percent = ((FLOAT)totalUploadedLength / context->TotalFileLength * 100);
PPH_STRING totalLength = PhFormatSize(context->TotalFileLength, -1);
PPH_STRING totalDownloadedLength = PhFormatSize(totalUploadedLength, -1);
PPH_STRING totalSpeed = PhFormatSize(bps, -1);
PPH_STRING totalSpeed = PhFormatSize(timeBitsPerSecond, -1);
PPH_STRING dlLengthString = PhFormatString(
L"%s of %s @ %s/s",
@@ -583,7 +553,7 @@ static NTSTATUS UploadFileThreadStart(
PhDereferenceObject(totalDownloadedLength);
// Update the progress bar position
PostMessage(context->ProgressHandle, PBM_SETPOS, MulDiv(100, totalUploadedLength, context->TotalFileLength), 0);
PostMessage(context->ProgressHandle, PBM_SETPOS, (INT)percent, 0);
}
}
@@ -743,10 +713,6 @@ static NTSTATUS UploadFileThreadStart(
}
__finally
{
//assert(ansiFooterData->Length == totalPostFooterWritten);
//assert(ansiPostData->Length == totalPostHeaderWritten);
//assert(totalUploadedLength == context->TotalFileLength);
if (postBoundary)
{
PhDereferenceObject(postBoundary);
@@ -754,12 +720,12 @@ static NTSTATUS UploadFileThreadStart(
if (ansiFooterData)
{
PhReferenceObject(ansiFooterData);
PhDereferenceObject(ansiFooterData);
}
if (ansiPostData)
{
PhReferenceObject(ansiPostData);
PhDereferenceObject(ansiPostData);
}
if (httpPostFooter.String)
@@ -794,6 +760,7 @@ static NTSTATUS UploadCheckThreadStart(
PSERVICE_INFO serviceInfo = NULL;
PPH_STRING hashString = NULL;
PPH_STRING subObjectName = NULL;
HANDLE fileHandle;
PUPLOAD_CONTEXT context = (PUPLOAD_CONTEXT)Parameter;
@@ -803,7 +770,7 @@ static NTSTATUS UploadCheckThreadStart(
{
// Open the file and check its size.
status = PhCreateFileWin32(
&context->FileHandle,
&fileHandle,
context->FileName->Buffer,
FILE_GENERIC_READ,
0,
@@ -812,26 +779,23 @@ static NTSTATUS UploadCheckThreadStart(
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT
);
if (NT_SUCCESS(status))
{
if (NT_SUCCESS(status = PhGetFileSize(context->FileHandle, &fileSize64)))
{
if (fileSize64.QuadPart > 20 * 1024 * 1024) // 20 MB
{
RaiseUploadError(context, L"The file is too large (over 20 MB)", ERROR_FILE_TOO_LARGE);
__leave;
}
context->TotalFileLength = fileSize64.LowPart;
}
}
if (!NT_SUCCESS(status))
{
RaiseUploadError(context, L"Unable to open the file", RtlNtStatusToDosError(status));
__leave;
}
if (NT_SUCCESS(status = PhGetFileSize(fileHandle, &fileSize64)))
{
if (fileSize64.QuadPart > 20 * 1024 * 1024) // 20 MB
{
RaiseUploadError(context, L"The file is too large (over 20 MB)", ERROR_FILE_TOO_LARGE);
__leave;
}
context->TotalFileLength = fileSize64.LowPart;
}
// Get proxy configuration and create winhttp handle (used for all winhttp sessions + requests).
{
PPH_STRING phVersion = NULL;
@@ -840,7 +804,7 @@ static NTSTATUS UploadCheckThreadStart(
// Create a user agent string.
phVersion = PhGetPhVersion();
userAgent = PhConcatStrings2(L"Process Hacker ", phVersion->Buffer);
userAgent = PhConcatStrings2(L"ProcessHacker_", phVersion->Buffer);
// Query the current system proxy
WinHttpGetIEProxyConfigForCurrentUser(&proxyConfig);
@@ -870,7 +834,7 @@ static NTSTATUS UploadCheckThreadStart(
ULONG bufferLength = 0;
UCHAR hash[32];
status = HashFileAndResetPosition(context->FileHandle, &fileSize64, HASH_SHA256, hash);
status = HashFileAndResetPosition(fileHandle, &fileSize64, HASH_SHA256, hash);
if (!NT_SUCCESS(status))
{
RaiseUploadError(context, L"Unable to hash the file", RtlNtStatusToDosError(status));
@@ -918,7 +882,7 @@ static NTSTATUS UploadCheckThreadStart(
ULONG bufferLength = 0;
UCHAR hash[20];
status = HashFileAndResetPosition(context->FileHandle, &fileSize64, HASH_SHA1, hash);
status = HashFileAndResetPosition(fileHandle, &fileSize64, HASH_SHA1, hash);
if (!NT_SUCCESS(status))
{
RaiseUploadError(context, L"Unable to hash the file", RtlNtStatusToDosError(status));
@@ -956,7 +920,7 @@ static NTSTATUS UploadCheckThreadStart(
ULONG status = 0;
ULONG statusLength = sizeof(statusLength);
status = HashFileAndResetPosition(context->FileHandle, &fileSize64, HASH_SHA256, hash);
status = HashFileAndResetPosition(fileHandle, &fileSize64, HASH_SHA256, hash);
if (!NT_SUCCESS(status))
{
RaiseUploadError(context, L"Unable to hash the file", RtlNtStatusToDosError(status));
@@ -1044,15 +1008,8 @@ static NTSTATUS UploadCheckThreadStart(
}
__finally
{
if (hashString)
{
PhDereferenceObject(hashString);
}
if (subObjectName)
{
PhDereferenceObject(subObjectName);
}
PhSwapReference2(&hashString, NULL);
PhSwapReference2(&subObjectName, NULL);
if (requestHandle)
{
@@ -1063,12 +1020,15 @@ static NTSTATUS UploadCheckThreadStart(
{
WinHttpCloseHandle(connectHandle);
}
if (fileHandle)
NtClose(fileHandle);
}
return status;
}
INT_PTR CALLBACK UploadDlgProc(
static INT_PTR CALLBACK UploadDlgProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
@@ -1088,14 +1048,11 @@ INT_PTR CALLBACK UploadDlgProc(
if (uMsg == WM_NCDESTROY)
{
if (context->FileName)
PhDereferenceObject(context->FileName);
if (context->BaseFileName)
PhDereferenceObject(context->BaseFileName);
if (context->WindowFileName)
PhDereferenceObject(context->WindowFileName);
PhSwapReference2(&context->FileName, NULL);
PhSwapReference2(&context->BaseFileName, NULL);
PhSwapReference2(&context->WindowFileName, NULL);
PhSwapReference2(&context->LaunchCommand, NULL);
PhSwapReference2(&context->ObjectName, NULL);
if (context->MessageFont)
DeleteObject(context->MessageFont);
@@ -1103,16 +1060,8 @@ INT_PTR CALLBACK UploadDlgProc(
if (context->HttpHandle)
WinHttpCloseHandle(context->HttpHandle);
if (context->ObjectName)
PhDereferenceObject(context->ObjectName);
if (context->FileHandle)
NtClose(context->FileHandle);
if (context->LaunchCommand)
PhDereferenceObject(context->LaunchCommand);
RemoveProp(hwndDlg, L"Context");
PhFree(context);
}
}
@@ -1133,7 +1082,9 @@ INT_PTR CALLBACK UploadDlgProc(
context->ProgressHandle = GetDlgItem(hwndDlg, IDC_PROGRESS1);
context->MessageHandle = GetDlgItem(hwndDlg, IDC_MESSAGE);
context->MessageFont = InitializeFont(context->MessageHandle);
context->WindowFileName = PhFormatString(L"Uploading: %s", context->BaseFileName->Buffer);
context->UploadServiceState = PhUploadServiceChecking;
// Reset the window status...
Static_SetText(context->MessageHandle, context->WindowFileName->Buffer);
@@ -1150,8 +1101,6 @@ INT_PTR CALLBACK UploadDlgProc(
break;
}
context->UploadServiceState = PhUploadServiceChecking;
if (dialogThread = PhCreateThread(0, (PUSER_THREAD_START_ROUTINE)UploadCheckThreadStart, (PVOID)context))
NtClose(dialogThread);
}
@@ -1251,25 +1200,22 @@ INT_PTR CALLBACK UploadDlgProc(
break;
case UM_ERROR:
{
PPH_STRING errorMessage = (PPH_STRING)lParam;
context->UploadServiceState = PhUploadServiceMaximum;
Static_SetText(GetDlgItem(hwndDlg, IDNO), L"Close");
if (context->ErrorMessage)
if (errorMessage)
{
Static_SetText(context->MessageHandle, context->ErrorMessage->Buffer);
PhDereferenceObject(context->ErrorMessage);
}
if (context->ErrorStatusMessage)
{
Static_SetText(context->StatusHandle, context->ErrorStatusMessage->Buffer);
PhDereferenceObject(context->ErrorStatusMessage);
Static_SetText(GetDlgItem(hwndDlg, IDC_MESSAGE), errorMessage->Buffer);
PhSwapReference2(&errorMessage, NULL);
}
else
{
Static_SetText(context->StatusHandle, L"");
}
Static_SetText(GetDlgItem(hwndDlg, IDC_MESSAGE), L"Error");
}
Static_SetText(GetDlgItem(hwndDlg, IDC_STATUS), L"");
Static_SetText(GetDlgItem(hwndDlg, IDNO), L"Close");
}
break;
}
@@ -1277,19 +1223,62 @@ INT_PTR CALLBACK UploadDlgProc(
return FALSE;
}
static NTSTATUS PhUploadToDialogThreadStart(
_In_ PVOID Parameter
)
{
BOOL result;
MSG message;
HWND dialogHandle;
PH_AUTO_POOL autoPool;
PUPLOAD_CONTEXT context = (PUPLOAD_CONTEXT)Parameter;
PhInitializeAutoPool(&autoPool);
dialogHandle = CreateDialogParam(
(HINSTANCE)PluginInstance->DllBase,
MAKEINTRESOURCE(IDD_PROGRESS),
PhMainWndHandle,
UploadDlgProc,
(LPARAM)Parameter
);
ShowWindow(dialogHandle, SW_SHOW);
SetForegroundWindow(dialogHandle);
while (result = GetMessage(&message, NULL, 0, 0))
{
if (result == -1)
break;
if (!IsDialogMessage(dialogHandle, &message))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
PhDrainAutoPool(&autoPool);
}
PhDeleteAutoPool(&autoPool);
DestroyWindow(dialogHandle);
return STATUS_SUCCESS;
}
VOID UploadToOnlineService(
_In_ PPH_STRING FileName,
_In_ ULONG Service
)
{
HANDLE dialogThread = NULL;
PUPLOAD_CONTEXT context = (PUPLOAD_CONTEXT)PhAllocate(sizeof(UPLOAD_CONTEXT));
memset(context, 0, sizeof(UPLOAD_CONTEXT));
context->Service = Service;
context->FileName = PhFormatString(L"%s", FileName->Buffer);
context->FileName = PhDuplicateString(FileName);
context->BaseFileName = PhGetBaseName(context->FileName);
context->WindowFileName = PhFormatString(L"Uploading: %s", context->BaseFileName->Buffer);
if (dialogThread = PhCreateThread(0, (PUSER_THREAD_START_ROUTINE)PhUploadToDialogThreadStart, (PVOID)context))
NtClose(dialogThread);