mirror of
https://github.com/hufrea/byedpi.git
synced 2025-06-30 02:31:15 +00:00
parent
45c201cfd6
commit
0588ecc38d
67
desync.c
67
desync.c
@ -251,25 +251,42 @@ static ssize_t send_fake(int sfd, const char *buffer,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define MAX_TFILES 32
|
#define MAX_TF 2
|
||||||
|
|
||||||
int tfiles_count = 0;
|
struct tf_s {
|
||||||
HANDLE tfiles[MAX_TFILES] = { 0 };
|
HANDLE tfile;
|
||||||
OVERLAPPED ov[MAX_TFILES] = { 0 };
|
OVERLAPPED ov;
|
||||||
|
};
|
||||||
|
|
||||||
|
int tf_count = 0;
|
||||||
|
struct tf_s tf_exems[MAX_TF] = { 0 };
|
||||||
|
|
||||||
|
|
||||||
static HANDLE openTFile(void)
|
static struct tf_s *getTFE(void)
|
||||||
{
|
{
|
||||||
if (tfiles_count == MAX_TFILES) {
|
struct tf_s *s = 0;
|
||||||
tfiles_count = 0;
|
if (tf_count < MAX_TF)
|
||||||
}
|
s = &tf_exems[tf_count];
|
||||||
HANDLE *p = &tfiles[tfiles_count];
|
else {
|
||||||
if (*p) {
|
HANDLE events[MAX_TF];
|
||||||
if (!CloseHandle(*p)) {
|
for (int i = 0; i < MAX_TF; i++) {
|
||||||
uniperror("CloseHandle");
|
events[i] = tf_exems[i].ov.hEvent;
|
||||||
|
}
|
||||||
|
DWORD ret = WaitForMultipleObjects(MAX_TF, events, FALSE, INFINITE);
|
||||||
|
|
||||||
|
if (ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + MAX_TF) {
|
||||||
|
s = &tf_exems[ret - WAIT_OBJECT_0];
|
||||||
|
CloseHandle(s->ov.hEvent);
|
||||||
|
CloseHandle(s->tfile);
|
||||||
}
|
}
|
||||||
*p = 0;
|
|
||||||
}
|
}
|
||||||
|
if (s) memset(s, 0, sizeof(*s));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static HANDLE openTempFile(void)
|
||||||
|
{
|
||||||
char path[MAX_PATH], temp[MAX_PATH + 1];
|
char path[MAX_PATH], temp[MAX_PATH + 1];
|
||||||
if (!GetTempPath(sizeof(temp), temp)) {
|
if (!GetTempPath(sizeof(temp), temp)) {
|
||||||
uniperror("GetTempPath");
|
uniperror("GetTempPath");
|
||||||
@ -288,8 +305,6 @@ static HANDLE openTFile(void)
|
|||||||
uniperror("CreateFileA");
|
uniperror("CreateFileA");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*p = hfile;
|
|
||||||
tfiles_count++;
|
|
||||||
return hfile;
|
return hfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,10 +312,15 @@ static HANDLE openTFile(void)
|
|||||||
static ssize_t send_fake(int sfd, const char *buffer,
|
static ssize_t send_fake(int sfd, const char *buffer,
|
||||||
long pos, const struct desync_params *opt, struct packet pkt)
|
long pos, const struct desync_params *opt, struct packet pkt)
|
||||||
{
|
{
|
||||||
HANDLE hfile = openTFile();
|
struct tf_s *s = getTFE();
|
||||||
|
if (!s) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
HANDLE hfile = openTempFile();
|
||||||
if (!hfile) {
|
if (!hfile) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
s->tfile = hfile;
|
||||||
ssize_t len = -1;
|
ssize_t len = -1;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@ -326,10 +346,12 @@ 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;
|
||||||
}
|
}
|
||||||
OVERLAPPED *op = &ov[tfiles_count - 1];
|
s->ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
memset(op, 0, sizeof(*op));
|
if (!s->ov.hEvent) {
|
||||||
|
uniperror("CreateEvent");
|
||||||
if (!TransmitFile(sfd, hfile, pos, pos, op,
|
break;
|
||||||
|
}
|
||||||
|
if (!TransmitFile(sfd, s->tfile, pos, pos, &s->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)
|
||||||
&& (WSAGetLastError() != WSA_IO_PENDING)) {
|
&& (WSAGetLastError() != WSA_IO_PENDING)) {
|
||||||
@ -349,8 +371,13 @@ static ssize_t send_fake(int sfd, const char *buffer,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
len = pos;
|
len = pos;
|
||||||
|
if (tf_count < MAX_TF) tf_count++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (len < 0) {
|
||||||
|
CloseHandle(s->tfile);
|
||||||
|
if (s->ov.hEvent) CloseHandle(s->ov.hEvent);
|
||||||
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user