13 HAMSICONTEXT amsiContext =
nullptr;
14 HAMSISESSION amsiSession =
nullptr;
15 std::string copy_path_destination;
17 if (copy_path !=
"") {
18 LPCSTR baseName = PathFindFileNameA(file_path.c_str());
19 copy_path_destination = copy_path + baseName;
20 CopyFileA(file_path.c_str(), copy_path_destination.c_str(),
false);
23 copy_path_destination = file_path;
26 HRESULT hr = AmsiInitialize(L
"Panoptes Scanner", &amsiContext);
29 return HRESULT_FROM_WIN32(GetLastError());
32 hr = AmsiOpenSession(amsiContext, &amsiSession);
35 AmsiUninitialize(amsiContext);
36 return HRESULT_FROM_WIN32(GetLastError());
40 DWORD dwFileAttributes = GetFileAttributesA(copy_path_destination.c_str());
41 if (dwFileAttributes == INVALID_FILE_ATTRIBUTES) {
42 return HRESULT_FROM_WIN32(GetLastError());
45 HANDLE fileHandle = CreateFileA(copy_path_destination.c_str(), GENERIC_READ, FILE_SHARE_READ,
nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
nullptr);
46 if (fileHandle == INVALID_HANDLE_VALUE)
48 AmsiUninitialize(amsiContext);
49 return HRESULT_FROM_WIN32(GetLastError());
52 DWORD fileSize = GetFileSize(fileHandle,
nullptr);
53 if (fileSize == INVALID_FILE_SIZE)
55 CloseHandle(fileHandle);
56 AmsiUninitialize(amsiContext);
57 return HRESULT_FROM_WIN32(GetLastError());
60 LPVOID fileBuffer = VirtualAlloc(
nullptr, fileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
61 if (fileBuffer ==
nullptr)
63 CloseHandle(fileHandle);
64 AmsiUninitialize(amsiContext);
65 return HRESULT_FROM_WIN32(GetLastError());
69 if (!ReadFile(fileHandle, fileBuffer, fileSize, &bytesRead,
nullptr))
71 VirtualFree(fileBuffer, 0, MEM_RELEASE);
72 CloseHandle(fileHandle);
73 AmsiUninitialize(amsiContext);
74 return HRESULT_FROM_WIN32(GetLastError());
77 const int MAX_RETRIES = 3;
78 const int RETRY_DELAY_MS = 1000;
84 hr = AmsiScanBuffer(amsiContext, fileBuffer, fileSize,
nullptr, amsiSession, &
result);
87 if (hr == HRESULT_FROM_WIN32(ERROR_NOT_READY) && retryCount < MAX_RETRIES)
90 Sleep(RETRY_DELAY_MS);
99 VirtualFree(fileBuffer, 0, MEM_RELEASE);
100 CloseHandle(fileHandle);
101 AmsiUninitialize(amsiContext);
105 }
while (FAILED(hr) && retryCount < MAX_RETRIES);
107 VirtualFree(fileBuffer, 0, MEM_RELEASE);
108 CloseHandle(fileHandle);
109 AmsiUninitialize(amsiContext);