Repository :
https://github.com/FarGroup/FarManager
On branch : master
Link :
https://github.com/FarGroup/FarManager/commit/4b543369887e7566f644edbf7bdc041782383ffa
>---------------------------------------------------------------
commit 4b543369887e7566f644edbf7bdc041782383ffa
Author: Shmuel Zeigerman <
solo...@gmail.com>
Date: Sun Sep 28 10:59:03 2025 +0300
LuaFAR: refactoring
>---------------------------------------------------------------
4b543369887e7566f644edbf7bdc041782383ffa
plugins/luamacro/_globalinfo.lua | 2 +-
plugins/luamacro/changelog | 4 ++
plugins/luamacro/luafar/lf_version.h | 2 +-
plugins/luamacro/luafar/lf_win.c | 71 ++++++++++++++++++++----------------
4 files changed, 46 insertions(+), 33 deletions(-)
diff --git a/plugins/luamacro/_globalinfo.lua b/plugins/luamacro/_globalinfo.lua
index d7409860f..b207c92c4 100644
--- a/plugins/luamacro/_globalinfo.lua
+++ b/plugins/luamacro/_globalinfo.lua
@@ -1,6 +1,6 @@
function export.GetGlobalInfo()
return {
- Version = { 3, 0, 0, 893 },
+ Version = { 3, 0, 0, 894 },
MinFarVersion = { 3, 0, 0, 6546 },
Guid = win.Uuid("4EBBEFC8-2084-4B7F-94C0-692CE136894D"),
Title = "LuaMacro",
diff --git a/plugins/luamacro/changelog b/plugins/luamacro/changelog
index 8bd19f2cf..4d251b39a 100644
--- a/plugins/luamacro/changelog
+++ b/plugins/luamacro/changelog
@@ -1,3 +1,7 @@
+shmuel 2025-09-28 10:56:35+03:00 - build 894
+
+1. LuaFAR: refactoring.
+
rohitab 2025-09-27 13:33:20+10:00 - build 893
1. gh-611: Enable win.GetFileTimes/win.SetFileTimes to get/set change time.
diff --git a/plugins/luamacro/luafar/lf_version.h b/plugins/luamacro/luafar/lf_version.h
index 3e3c6d55d..29a3e0979 100644
--- a/plugins/luamacro/luafar/lf_version.h
+++ b/plugins/luamacro/luafar/lf_version.h
@@ -1,3 +1,3 @@
#include <farversion.hpp>
-#define PLUGIN_BUILD 893
+#define PLUGIN_BUILD 894
diff --git a/plugins/luamacro/luafar/lf_win.c b/plugins/luamacro/luafar/lf_win.c
index 6a232c642..438c60521 100644
--- a/plugins/luamacro/luafar/lf_win.c
+++ b/plugins/luamacro/luafar/lf_win.c
@@ -865,26 +865,38 @@ static void PutFileTimeToTableEx(lua_State *L, const LARGE_INTEGER *FT, const ch
lua_setfield(L, -2, key);
}
+typedef NTSTATUS(NTAPI* QueryInformationFile)(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass);
+typedef NTSTATUS(NTAPI* SetInformationFile)(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass);
+static QueryInformationFile pNtQueryInformationFile;
+static SetInformationFile pNtSetInformationFile;
+
+static void SetFunctionPointers()
+{
+ HMODULE hNtDll = GetModuleHandleW(L"ntdll.dll");
+ if (hNtDll)
+ {
+ pNtQueryInformationFile = (QueryInformationFile)(INT_PTR)GetProcAddress(hNtDll, "NtQueryInformationFile");
+ pNtSetInformationFile = (SetInformationFile)(INT_PTR)GetProcAddress(hNtDll, "NtSetInformationFile");
+ }
+}
+
static int win_GetFileTimes(lua_State *L)
{
int res = 0;
- const wchar_t* FileName = check_utf8_string(L, 1, NULL);
- DWORD attr = GetFileAttributesW(FileName);
- if (attr != INVALID_FILE_ATTRIBUTES)
+ if (pNtQueryInformationFile)
{
- DWORD flags = (attr & FILE_ATTRIBUTE_DIRECTORY) ? FILE_FLAG_BACKUP_SEMANTICS : 0;
- HANDLE hFile = CreateFileW(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,flags,NULL);
- if (hFile != INVALID_HANDLE_VALUE)
+ const wchar_t* FileName = check_utf8_string(L, 1, NULL);
+ DWORD attr = GetFileAttributesW(FileName);
+ if (attr != INVALID_FILE_ATTRIBUTES)
{
- HMODULE hNtDll = GetModuleHandleW(L"ntdll.dll");
- if (hNtDll)
+ DWORD flags = (attr & FILE_ATTRIBUTE_DIRECTORY) ? FILE_FLAG_BACKUP_SEMANTICS : 0;
+ HANDLE hFile = CreateFileW(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,flags,NULL);
+ if (hFile != INVALID_HANDLE_VALUE)
{
IO_STATUS_BLOCK iob;
FILE_BASIC_INFO fbi;
const int FileBasicInformation = 4;
- typedef NTSTATUS(NTAPI* NtQueryInformationFile)(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass);
- NtQueryInformationFile pNtQueryInformationFile = (NtQueryInformationFile)(INT_PTR)GetProcAddress(hNtDll, "NtQueryInformationFile");
- if (pNtQueryInformationFile && NT_SUCCESS(pNtQueryInformationFile(hFile, &iob, &fbi, sizeof(fbi), FileBasicInformation)))
+ if (NT_SUCCESS(pNtQueryInformationFile(hFile, &iob, &fbi, sizeof(fbi), FileBasicInformation)))
{
lua_createtable(L, 0, 4);
PutFileTimeToTableEx(L, &fbi.CreationTime, "CreationTime");
@@ -893,8 +905,8 @@ static int win_GetFileTimes(lua_State *L)
PutFileTimeToTableEx(L, &fbi.ChangeTime, "ChangeTime");
res = 1;
}
+ CloseHandle(hFile);
}
- CloseHandle(hFile);
}
}
if (res == 0)
@@ -927,39 +939,34 @@ static int ExtractFileTime(lua_State *L, const char *key, LARGE_INTEGER* target,
static int win_SetFileTimes(lua_State *L)
{
int res = 0;
- const wchar_t* FileName = check_utf8_string(L, 1, NULL);
- DWORD attr = GetFileAttributesW(FileName);
- luaL_checktype(L, 2, LUA_TTABLE);
- if (attr != INVALID_FILE_ATTRIBUTES)
+ if (pNtSetInformationFile)
{
- DWORD flags = (attr & FILE_ATTRIBUTE_DIRECTORY) ? FILE_FLAG_BACKUP_SEMANTICS : 0;
- HANDLE hFile = CreateFileW(FileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,flags,NULL);
- if (hFile != INVALID_HANDLE_VALUE)
+ const wchar_t* FileName = check_utf8_string(L, 1, NULL);
+ DWORD attr = GetFileAttributesW(FileName);
+ luaL_checktype(L, 2, LUA_TTABLE);
+ if (attr != INVALID_FILE_ATTRIBUTES && pNtSetInformationFile)
{
- HMODULE hNtDll = GetModuleHandleW(L"ntdll.dll");
- if (hNtDll)
+ DWORD flags = (attr & FILE_ATTRIBUTE_DIRECTORY) ? FILE_FLAG_BACKUP_SEMANTICS : 0;
+ HANDLE hFile = CreateFileW(FileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,flags,NULL);
+ if (hFile != INVALID_HANDLE_VALUE)
{
- BOOL extracted = FALSE;
IO_STATUS_BLOCK iob;
FILE_BASIC_INFO fbi;
memset(&fbi, 0, sizeof(fbi));
lua_pushvalue(L, 2);
- extracted |= ExtractFileTime(L, "CreationTime", &fbi.CreationTime, hFile);
- extracted |= ExtractFileTime(L, "LastAccessTime", &fbi.LastAccessTime, hFile);
- extracted |= ExtractFileTime(L, "LastWriteTime", &fbi.LastWriteTime, hFile);
- extracted |= ExtractFileTime(L, "ChangeTime", &fbi.ChangeTime, hFile);
- if (extracted)
+ if (ExtractFileTime(L, "CreationTime", &fbi.CreationTime, hFile) // don't use || here
+ | ExtractFileTime(L, "LastAccessTime", &fbi.LastAccessTime, hFile)
+ | ExtractFileTime(L, "LastWriteTime", &fbi.LastWriteTime, hFile)
+ | ExtractFileTime(L, "ChangeTime", &fbi.ChangeTime, hFile))
{
const int FileBasicInformation = 4;
- typedef NTSTATUS(NTAPI* NtSetInformationFile)(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FileInformation, ULONG Length, FILE_INFORMATION_CLASS FileInformationClass);
- NtSetInformationFile pNtSetInformationFile = (NtSetInformationFile)(INT_PTR)GetProcAddress(hNtDll, "NtSetInformationFile");
- if (pNtSetInformationFile && NT_SUCCESS(pNtSetInformationFile(hFile, &iob, &fbi, sizeof(fbi), FileBasicInformation)))
+ if (NT_SUCCESS(pNtSetInformationFile(hFile, &iob, &fbi, sizeof(fbi), FileBasicInformation)))
{
res = 1;
}
}
+ CloseHandle(hFile);
}
- CloseHandle(hFile);
}
}
lua_pushboolean(L, res);
@@ -1061,5 +1068,7 @@ LUALIB_API int luaopen_win(lua_State *L)
lua_pushvalue(L, -2);
lua_call(L, 1, 0);
+ SetFunctionPointers();
+
return 1;
}