0
0
mirror of https://github.com/hufrea/byedpi.git synced 2025-06-30 18:43:04 +00:00

Dont close temp file after TransmitFile

hotfix for #154
This commit is contained in:
ruti 2025-01-19 17:21:37 +03:00
parent 1d85d015c2
commit 41ffee5d9c

View File

@ -253,36 +253,58 @@ static ssize_t send_fake(int sfd, const char *buffer,
#ifdef _WIN32 #ifdef _WIN32
OVERLAPPED ov = { 0 }; OVERLAPPED ov = { 0 };
static ssize_t send_fake(int sfd, const char *buffer, #define MAX_TFILES 32
long pos, const struct desync_params *opt, struct packet pkt) int tfiles_count = 0;
HANDLE tfiles[MAX_TFILES] = { 0 };
static HANDLE openTFile(void)
{ {
if (tfiles_count == MAX_TFILES) {
tfiles_count = 0;
}
HANDLE *p = &tfiles[tfiles_count];
if (*p) {
if (!CloseHandle(*p)) {
uniperror("CloseHandle");
*p = 0;
return 0;
}
*p = 0;
}
char path[MAX_PATH], temp[MAX_PATH + 1]; char path[MAX_PATH], temp[MAX_PATH + 1];
int ps = GetTempPath(sizeof(temp), temp); int ps = GetTempPath(sizeof(temp), temp);
if (!ps) { if (!ps) {
uniperror("GetTempPath"); uniperror("GetTempPath");
return -1; return 0;
} }
if (!GetTempFileName(temp, "t", 0, path)) { if (!GetTempFileName(temp, "t", 0, path)) {
uniperror("GetTempFileName"); uniperror("GetTempFileName");
return -1; return 0;
} }
LOG(LOG_L, "temp file: %s\n", path); LOG(LOG_L, "temp file: %s\n", path);
HANDLE hfile = CreateFileA(path, GENERIC_READ | GENERIC_WRITE, HANDLE hfile = CreateFileA(path, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL); FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL);
if (hfile == INVALID_HANDLE_VALUE) { if (hfile == INVALID_HANDLE_VALUE) {
uniperror("CreateFileA"); uniperror("CreateFileA");
return 0;
}
*p = hfile;
tfiles_count++;
return hfile;
}
static ssize_t send_fake(int sfd, const char *buffer,
long pos, const struct desync_params *opt, struct packet pkt)
{
HANDLE hfile = openTFile();
if (!hfile) {
return -1; return -1;
} }
ssize_t len = -1; ssize_t len = -1;
while (1) { while (1) {
ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ov.hEvent) {
uniperror("CreateEvent");
break;
}
DWORD wrtcnt = 0; DWORD wrtcnt = 0;
if (!WriteFile(hfile, pkt.data, pkt.size < pos ? pkt.size : pos, &wrtcnt, 0)) { if (!WriteFile(hfile, pkt.data, pkt.size < pos ? pkt.size : pos, &wrtcnt, 0)) {
uniperror("WriteFile"); uniperror("WriteFile");
@ -305,6 +327,8 @@ static ssize_t send_fake(int sfd, const char *buffer,
if (setttl(sfd, opt->ttl ? opt->ttl : DEFAULT_TTL) < 0) { if (setttl(sfd, opt->ttl ? opt->ttl : DEFAULT_TTL) < 0) {
break; break;
} }
memset(&ov, 0, sizeof(ov));
if (!TransmitFile(sfd, hfile, pos, pos, &ov, if (!TransmitFile(sfd, hfile, pos, pos, &ov,
NULL, TF_USE_KERNEL_APC | TF_WRITE_BEHIND)) { NULL, TF_USE_KERNEL_APC | TF_WRITE_BEHIND)) {
if ((GetLastError() != ERROR_IO_PENDING) if ((GetLastError() != ERROR_IO_PENDING)
@ -329,11 +353,6 @@ static ssize_t send_fake(int sfd, const char *buffer,
len = pos; len = pos;
break; break;
} }
if (!CloseHandle(hfile)
|| (ov.hEvent && !CloseHandle(ov.hEvent))) {
uniperror("CloseHandle");
return -1;
}
return len; return len;
} }
#endif #endif