...
|
...
|
@@ -903,7 +903,8 @@ int CLAMAPI Scan_ScanObjectByHandle(CClamAVScanner *pScanner, HANDLE object, int
|
903
|
903
|
si.pThreatName = NULL;
|
904
|
904
|
logg("*in final_cb with clamav context %p, instance %p, fd %d, result %d, virusname %S)\n", &sctx, inst, fd, res, si.pThreatName);
|
905
|
905
|
si.pThreatType = threat_type(virname);
|
906
|
|
- si.object = duphdl;
|
|
906
|
+ si.object = INVALID_HANDLE_VALUE;
|
|
907
|
+ si.objectId = INVALID_HANDLE_VALUE;
|
907
|
908
|
si.pInnerObjectPath = NULL;
|
908
|
909
|
lo = SetFilePointer(duphdl, 0, &hi, FILE_CURRENT);
|
909
|
910
|
SetFilePointer(duphdl, 0, &hi2, FILE_BEGIN);
|
...
|
...
|
@@ -941,6 +942,8 @@ int CLAMAPI Scan_ScanObjectByHandle(CClamAVScanner *pScanner, HANDLE object, int
|
941
|
941
|
scaninfo->scanPhase = SCAN_PHASE_FINAL;
|
942
|
942
|
scaninfo->errorCode = CLAMAPI_SUCCESS;
|
943
|
943
|
scaninfo->pThreatType = threat_type(virname);
|
|
944
|
+ scaninfo->object = INVALID_HANDLE_VALUE;
|
|
945
|
+ scaninfo->objectId = INVALID_HANDLE_VALUE;
|
944
|
946
|
wvirname = (wchar_t *)(scaninfo + 1);
|
945
|
947
|
scaninfo->pThreatName = wvirname;
|
946
|
948
|
memcpy(wvirname, L"Clam.", 10);
|
...
|
...
|
@@ -990,8 +993,6 @@ cl_error_t prescan_cb(int fd, void *context) {
|
990
|
990
|
CLAM_ACTION act;
|
991
|
991
|
HANDLE fdhdl;
|
992
|
992
|
DWORD perf;
|
993
|
|
- long fpos;
|
994
|
|
- int rsz;
|
995
|
993
|
|
996
|
994
|
if(!context) {
|
997
|
995
|
logg("!prescan_cb called with NULL clamav context\n");
|
...
|
...
|
@@ -1007,46 +1008,53 @@ cl_error_t prescan_cb(int fd, void *context) {
|
1007
|
1007
|
si.pThreatName = NULL;
|
1008
|
1008
|
si.pInnerObjectPath = NULL;
|
1009
|
1009
|
|
1010
|
|
- while(1) {
|
1011
|
|
- static int tmpn;
|
1012
|
|
- snprintf(tmpf, sizeof(tmpf), "%s\\%08x.tmp", tmpdir, ++tmpn);
|
1013
|
|
- tmpf[sizeof(tmpf)-1] = '\0';
|
1014
|
|
- fdhdl = CreateFile(tmpf, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL);
|
1015
|
|
- if(fdhdl != INVALID_HANDLE_VALUE) {
|
1016
|
|
- logg("*prescan_cb: dumping content to tempfile %s (handle %p)\n", tmpf, fdhdl);
|
1017
|
|
- break;
|
1018
|
|
- }
|
1019
|
|
- if((perf = GetLastError()) != ERROR_FILE_EXISTS) {
|
1020
|
|
- logg("!prescan_cb: failed to create tempfile %s - error %u\n", tmpf, perf);
|
1021
|
|
- return CL_CLEAN;
|
|
1010
|
+ if(si.scanPhase == SCAN_PHASE_PRESCAN) {
|
|
1011
|
+ long fpos;
|
|
1012
|
+ int rsz;
|
|
1013
|
+ while(1) {
|
|
1014
|
+ static int tmpn;
|
|
1015
|
+ snprintf(tmpf, sizeof(tmpf), "%s\\%08x.tmp", tmpdir, ++tmpn);
|
|
1016
|
+ tmpf[sizeof(tmpf)-1] = '\0';
|
|
1017
|
+ fdhdl = CreateFile(tmpf, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL);
|
|
1018
|
+ if(fdhdl != INVALID_HANDLE_VALUE) {
|
|
1019
|
+ logg("*prescan_cb: dumping content to tempfile %s (handle %p)\n", tmpf, fdhdl);
|
|
1020
|
+ break;
|
|
1021
|
+ }
|
|
1022
|
+ if((perf = GetLastError()) != ERROR_FILE_EXISTS) {
|
|
1023
|
+ logg("!prescan_cb: failed to create tempfile %s - error %u\n", tmpf, perf);
|
|
1024
|
+ return CL_CLEAN;
|
|
1025
|
+ }
|
1022
|
1026
|
}
|
1023
|
|
- }
|
1024
|
1027
|
|
1025
|
|
- fpos = lseek(fd, 0, SEEK_CUR);
|
1026
|
|
- lseek(fd, 0, SEEK_SET);
|
1027
|
|
- while((rsz = read(fd, tmpf, sizeof(tmpf))) > 0) {
|
1028
|
|
- int wsz = 0;
|
1029
|
|
- while(wsz != rsz) {
|
1030
|
|
- DWORD rwsz;
|
1031
|
|
- if(!WriteFile(fdhdl, &tmpf[wsz], rsz - wsz, &rwsz, NULL)) {
|
1032
|
|
- logg("!prescan_cb: failed to write to tempfile %s - error %u\n", GetLastError());
|
1033
|
|
- lseek(fd, fpos, SEEK_SET);
|
1034
|
|
- CloseHandle(fdhdl);
|
1035
|
|
- return CL_CLEAN;
|
|
1028
|
+ fpos = lseek(fd, 0, SEEK_CUR);
|
|
1029
|
+ lseek(fd, 0, SEEK_SET);
|
|
1030
|
+ while((rsz = read(fd, tmpf, sizeof(tmpf))) > 0) {
|
|
1031
|
+ int wsz = 0;
|
|
1032
|
+ while(wsz != rsz) {
|
|
1033
|
+ DWORD rwsz;
|
|
1034
|
+ if(!WriteFile(fdhdl, &tmpf[wsz], rsz - wsz, &rwsz, NULL)) {
|
|
1035
|
+ logg("!prescan_cb: failed to write to tempfile %s - error %u\n", GetLastError());
|
|
1036
|
+ lseek(fd, fpos, SEEK_SET);
|
|
1037
|
+ CloseHandle(fdhdl);
|
|
1038
|
+ return CL_CLEAN;
|
|
1039
|
+ }
|
|
1040
|
+ wsz += rwsz;
|
1036
|
1041
|
}
|
1037
|
|
- wsz += rwsz;
|
1038
|
1042
|
}
|
1039
|
|
- }
|
1040
|
|
- if(rsz) {
|
1041
|
|
- logg("!prescan_cb: failed to read from clamav tempfile - errno = %d\n", errno);
|
|
1043
|
+ if(rsz) {
|
|
1044
|
+ logg("!prescan_cb: failed to read from clamav tempfile - errno = %d\n", errno);
|
|
1045
|
+ lseek(fd, fpos, SEEK_SET);
|
|
1046
|
+ CloseHandle(fdhdl);
|
|
1047
|
+ return CL_CLEAN;
|
|
1048
|
+ }
|
1042
|
1049
|
lseek(fd, fpos, SEEK_SET);
|
1043
|
|
- CloseHandle(fdhdl);
|
1044
|
|
- return CL_CLEAN;
|
|
1050
|
+ SetFilePointer(fdhdl, 0, NULL, FILE_BEGIN);
|
|
1051
|
+ si.object = fdhdl;
|
|
1052
|
+ si.objectId = (HANDLE)_get_osfhandle(fd);
|
|
1053
|
+ } else { /* SCAN_PHASE_INITIAL */
|
|
1054
|
+ si.object = INVALID_HANDLE_VALUE;
|
|
1055
|
+ si.objectId = INVALID_HANDLE_VALUE;
|
1045
|
1056
|
}
|
1046
|
|
- lseek(fd, fpos, SEEK_SET);
|
1047
|
|
- SetFilePointer(fdhdl, 0, NULL, FILE_BEGIN);
|
1048
|
|
- si.object = fdhdl;
|
1049
|
|
- si.objectId = (HANDLE)_get_osfhandle(fd);
|
1050
|
1057
|
logg("*prescan_cb (clamav context %p, instance %p) invoking callback %p with context %p\n", context, inst, inst->scancb, inst->scancb_ctx);
|
1051
|
1058
|
perf = GetTickCount();
|
1052
|
1059
|
inst->scancb(&si, &act, inst->scancb_ctx);
|