mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
RecycleManager.dll: Fixed eject issues with USB drives is some cases
This commit is contained in:
parent
d245e552f0
commit
b5120f4518
@ -23,6 +23,7 @@
|
|||||||
#include <ShlObj.h>
|
#include <ShlObj.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include "../../Library/RawString.h"
|
||||||
#include "../../Library/Export.h" // Rainmeter's exported functions
|
#include "../../Library/Export.h" // Rainmeter's exported functions
|
||||||
#include "../../Library/DisableThreadLibraryCalls.h" // contains DllMain entry point
|
#include "../../Library/DisableThreadLibraryCalls.h" // contains DllMain entry point
|
||||||
|
|
||||||
@ -41,7 +42,7 @@ struct BinData
|
|||||||
UINT lastCount;
|
UINT lastCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
HANDLE directory;
|
CRawString directory;
|
||||||
WCHAR drive;
|
WCHAR drive;
|
||||||
bool isFAT;
|
bool isFAT;
|
||||||
};
|
};
|
||||||
@ -49,7 +50,7 @@ struct BinData
|
|||||||
unsigned int __stdcall QueryRecycleBinThreadProc(void* pParam);
|
unsigned int __stdcall QueryRecycleBinThreadProc(void* pParam);
|
||||||
HRESULT GetFolderCLSID(LPCWSTR pszPath, CLSID* pathCLSID);
|
HRESULT GetFolderCLSID(LPCWSTR pszPath, CLSID* pathCLSID);
|
||||||
LPWSTR GetCurrentUserSid();
|
LPWSTR GetCurrentUserSid();
|
||||||
HANDLE GetRecycleBinHandle(WCHAR drive, bool& isFAT);
|
CRawString GetRecycleBinHandle(WCHAR drive, bool& isFAT);
|
||||||
|
|
||||||
std::vector<BinData> g_BinData;
|
std::vector<BinData> g_BinData;
|
||||||
double g_BinCount = 0;
|
double g_BinCount = 0;
|
||||||
@ -163,14 +164,28 @@ PLUGIN_EXPORT double Update(void* data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (data.directory)
|
else if (!data.directory.empty())
|
||||||
{
|
{
|
||||||
ULONGLONG lastWrite;
|
HANDLE bin = CreateFile(
|
||||||
GetFileTime(data.directory, NULL, NULL, (FILETIME*)&lastWrite);
|
data.directory.c_str(),
|
||||||
if (data.lastWrite != lastWrite)
|
GENERIC_READ,
|
||||||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
|
NULL,
|
||||||
|
OPEN_EXISTING,
|
||||||
|
FILE_FLAG_BACKUP_SEMANTICS,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (bin)
|
||||||
{
|
{
|
||||||
data.lastWrite = lastWrite;
|
ULONGLONG lastWrite;
|
||||||
changed = true;
|
GetFileTime(bin, NULL, NULL, (FILETIME*)&lastWrite);
|
||||||
|
if (data.lastWrite != lastWrite)
|
||||||
|
{
|
||||||
|
data.lastWrite = lastWrite;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(bin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,12 +196,6 @@ PLUGIN_EXPORT double Update(void* data)
|
|||||||
{
|
{
|
||||||
// Drive removed
|
// Drive removed
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
if (data.directory)
|
|
||||||
{
|
|
||||||
CloseHandle(data.directory);
|
|
||||||
}
|
|
||||||
|
|
||||||
iter = g_BinData.erase(iter);
|
iter = g_BinData.erase(iter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -196,7 +205,8 @@ PLUGIN_EXPORT double Update(void* data)
|
|||||||
if (buffer[i] != DRIVE_HANDLED)
|
if (buffer[i] != DRIVE_HANDLED)
|
||||||
{
|
{
|
||||||
// New drive
|
// New drive
|
||||||
BinData data = {0};
|
g_BinData.push_back(BinData());
|
||||||
|
BinData& data = g_BinData.back();
|
||||||
data.drive = buffer[i];
|
data.drive = buffer[i];
|
||||||
|
|
||||||
WCHAR drive[] = L"\0:\\";
|
WCHAR drive[] = L"\0:\\";
|
||||||
@ -205,8 +215,6 @@ PLUGIN_EXPORT double Update(void* data)
|
|||||||
{
|
{
|
||||||
data.directory = GetRecycleBinHandle(buffer[i], data.isFAT);
|
data.directory = GetRecycleBinHandle(buffer[i], data.isFAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_BinData.push_back(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,14 +236,6 @@ PLUGIN_EXPORT void Finalize(void* data)
|
|||||||
--g_InstanceCount;
|
--g_InstanceCount;
|
||||||
if (g_InstanceCount == 0)
|
if (g_InstanceCount == 0)
|
||||||
{
|
{
|
||||||
for (auto iter = g_BinData.cbegin(); iter != g_BinData.cend(); ++iter)
|
|
||||||
{
|
|
||||||
if ((*iter).directory)
|
|
||||||
{
|
|
||||||
CloseHandle((*iter).directory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WaitForSingleObject(g_Thread, INFINITE);
|
WaitForSingleObject(g_Thread, INFINITE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -322,7 +322,7 @@ LPWSTR GetCurrentUserSid()
|
|||||||
return sidStr;
|
return sidStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE GetRecycleBinHandle(WCHAR drive, bool& isFAT)
|
CRawString GetRecycleBinHandle(WCHAR drive, bool& isFAT)
|
||||||
{
|
{
|
||||||
WCHAR search[] = L"\0:\\";
|
WCHAR search[] = L"\0:\\";
|
||||||
search[0] = drive;
|
search[0] = drive;
|
||||||
@ -357,7 +357,8 @@ HANDLE GetRecycleBinHandle(WCHAR drive, bool& isFAT)
|
|||||||
binFolder = L"$RECYCLE.BIN";
|
binFolder = L"$RECYCLE.BIN";
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE hDir = NULL;
|
bool found = false;
|
||||||
|
|
||||||
WCHAR binPath[MAX_PATH];
|
WCHAR binPath[MAX_PATH];
|
||||||
_snwprintf_s(binPath, _TRUNCATE, L"%s%s\\", search, binFolder);
|
_snwprintf_s(binPath, _TRUNCATE, L"%s%s\\", search, binFolder);
|
||||||
|
|
||||||
@ -370,7 +371,7 @@ HANDLE GetRecycleBinHandle(WCHAR drive, bool& isFAT)
|
|||||||
if (_waccess(binPath, 0) != -1)
|
if (_waccess(binPath, 0) != -1)
|
||||||
{
|
{
|
||||||
isFAT = true;
|
isFAT = true;
|
||||||
return hDir;
|
found = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -389,14 +390,7 @@ HANDLE GetRecycleBinHandle(WCHAR drive, bool& isFAT)
|
|||||||
HRESULT hr = GetFolderCLSID(binPath, &id);
|
HRESULT hr = GetFolderCLSID(binPath, &id);
|
||||||
if (SUCCEEDED(hr) && IsEqualGUID(CLSID_RecycleBin, id))
|
if (SUCCEEDED(hr) && IsEqualGUID(CLSID_RecycleBin, id))
|
||||||
{
|
{
|
||||||
hDir = CreateFile(
|
found = true;
|
||||||
binPath,
|
|
||||||
GENERIC_READ,
|
|
||||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
||||||
NULL,
|
|
||||||
OPEN_EXISTING,
|
|
||||||
FILE_FLAG_BACKUP_SEMANTICS,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,6 +399,13 @@ HANDLE GetRecycleBinHandle(WCHAR drive, bool& isFAT)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hDir) RmLog(LOG_ERROR, L"RecycleManager.dll: Unable to find bin");
|
if (!found)
|
||||||
return hDir;
|
{
|
||||||
|
RmLog(LOG_ERROR, L"RecycleManager.dll: Unable to find bin");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return binPath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user