Π€ΡΠ½ΠΊΡΠΈΡ DllMain ΡΠ»ΡΠΆΠΈΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄ΠΎΠ»Π³ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ TLS ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ DLL.
ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ ΡΠ΅ΡΡΡΡΡ ΠΏΡΠΈ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΡΠ»ΡΡΠ°ΠΉ DLL_THREAD_DETACH) ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Ρ; Π΅ΡΠ»ΠΈ ΡΡΠΎΠ³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡΡ, ΡΠΎ ΡΠ΅ΡΡΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΠ΅ΡΠ΅, ΠΈΡΡΠ΅ΡΠΏΠ°ΡΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠ±ΠΎΡΠΌ Π² Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ΅ ΠΈΠ»ΠΈ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈΠ»ΠΈ ΠΊ ΡΠΎΠΌΡ ΠΈ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅ΠΌΡΡ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΉ ΠΏΡΡΠΌΠΎΠ³ΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΡΠΎΠΊΠ΅ΡΠ°ΠΌ Π½Π΅ ΠΈΠΌΠ΅ΡΡ, Π½ΠΎ, ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π΄Π΅ΡΡ, Π° Π½Π΅ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ Π³Π»Π°Π²Π°Ρ , ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π»Ρ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ DLL Π² ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ .
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΡΡΡ DLL ΠΊΠΎΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°, Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠ΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ 12.1 ΠΈ 12.2, Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π° Web-ΡΠ°ΠΉΡΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 12.4. SendReceiveSKST: Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½Π°Ρ DLL/* SendReceiveSKST.Ρ β DLL ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°. */
/* Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΊΠΎΠ½ΡΠ° */
/* ΡΡΡΠΎΠΊΠΈ ('\0'), ΡΠ°ΠΊ ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π·Π°ΡΠ°Π½Π΅Π΅ Π½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½. */
/* ΠΠΎΡΡΡΠΏΠ°ΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΡΠ΅ΡΠΈΠ·ΡΡΡΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ°Ρ ΠΌΠ΅ΠΆΠ΄Ρ */
/* Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ. */
/* ΠΠ»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² */
/* (Thread Local Storage, TLS), ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ² */
/* ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ Π·Π°ΠΊΡΡΡΡΠΌ "ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΠΌ". */
#define _NOEXCLUSIONS
#include "EvryThng.h"
#include "ClntSrvr.h" /* ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π·Π°ΠΏΠΈΡΠΈ Π·Π°ΠΏΡΠΎΡΠ° ΠΈ ΠΎΡΠ²Π΅ΡΠ°. */
typedef struct STATIC_BUF_T {
/* "static_buf" ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ "static_buf_len" Π±Π°ΠΉΡΠΎΠ² ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ . */
/* Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ (Π½ΡΠ»Π΅Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ) ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ, Π° ΠΌΠΎΠ³ΡΡ */
/* ΠΈ Π½Π΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ. */
char static_buf[MAX_RQRS_LEN] ;
LONG32 static_buf_len;
} STATIC_BUF;
static DWORD TlsIx = 0; /* ΠΠ½Π΄Π΅ΠΊΡ TLS β ΠΠΠ― ΠΠΠΠΠΠΠ ΠΠ ΠΠ¦ΠΠ‘Π‘Π Π‘ΠΠΠ ΠΠΠΠΠΠ‘.*/
/* ΠΠ»Ρ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ Π±Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ:
static char static_buf [MAX_RQRS_LEN];
static LONG32 static_buf_len; */
/* ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ DLL. */
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
STATIC_BUF * pBuf;
switch (fdwReason) {
case DLL_PROCESS_ATTACH:
TlsIx = TlsAlloc();
/* ΠΠ»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°. */
case DLL_THREAD_ATTACH:
/* Π£ΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΠ°ΠΌΡΡΡ Π½Π΅ Π±ΡΠ»Π° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°. */
TlsSetValue(TlsIx, NULL);
return TRUE; /* Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ. */
case DLL_PROCESS_DETACH:
/* ΠΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ. */
pBuf = TlsGetValue(TlsIx);
if (pBuf != NULL) {
free(pBuf);
pBuf = NULL;
}
return TRUE;
case DLL_THREAD_DETACH:
pBuf = TlsGetValue(TlsIx);
if (pBuf != NULL) {
free(pBuf);
pBuf = NULL;
}
return TRUE;
}
}
_declspec(dllexport)
BOOL ReceiveCSMessage(REQUEST *pRequest, SOCKET sd) {
/* ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ TRUE ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΎΡΠΈΠ±ΠΊΡ ΠΈΠ»ΠΈ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. */
BOOL Disconnect = FALSE;
LONG32 nRemainRecv = 0, nXfer, k; /* ΠΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΎ Π·Π½Π°ΠΊΠΎΠΌ. */
LPSTR pBuffer, message;
CHAR TempBuf[MAX_RQRS_LEN + 1];
STATIC_BUF *p;
p = (STATIC_BUF *)TlsGetValue(TlsIx);
if (p == NULL) { /* ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅. */
/* Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ½ΠΎ */
/* Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. ΠΡΡΠ³ΠΈΠ΅ ΡΠΈΠΏΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ TLS Π΄Π»Ρ ΠΈΠ½ΡΡ ΡΠ΅Π»Π΅ΠΉ. */
Ρ = malloc(sizeof(STATIC_BUF));
TlsSetValue(TlsIx, p);
if (p == NULL) return TRUE; /* ΠΡΠΈΠ±ΠΊΠ°. */
p->static_buf_len = 0; /* ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. */
}
message = pRequest->Record;
/* Π‘ΡΠΈΡΠ°ΡΡ Π΄ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΎΡΡΠ°Π²Π»ΡΡ ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ Π±ΡΡΠ΅ΡΠ΅. */
for (k = 0; k < p->static_buf_len && p->static_buf[k] != '\0'; k++) {
message[k] = p->static_buf[k];
} /* k β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². */
if (k < p->static_buf_len) { /* Π ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ Π±ΡΡΠ΅ΡΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ». */
message[k] = '\0';
p->static_buf_len β= (k + 1); /* Π‘ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ°. */
memcpy(p->static_buf, &(p->static_buf[k + 1]), p->static_buf_len);
return FALSE; /* ΠΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΠΊΠ΅ΡΠ° Π½Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ. */
}
/* ΠΠ΅ΡΠ΅Π΄Π°Π½ Π²Π΅ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π±ΡΡΠ΅Ρ. ΠΡΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½.*/
nRemainRecv = sizeof(TempBuf) β 1 β p->static_buf_len;
pBuffer = message + p->static_buf_len;
p->static_buf_len = 0;
while (nRemainRecv > 0 && !Disconnect) {
nXfer = recv(sd, TempBuf, nRemainRecv, 0);
if (nXfer <= 0) {
Disconnect = TRUE;
continue;
}
nRemainRecv β= nXfer;
/* ΠΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΡΠ΅Π»Π΅Π²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ Π½ΡΠ»Π΅Π²ΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΠΎΠΉ ΠΈΠΌΠ΅Π΅ΡΡΡ. */
for (k =0; k < nXfer && TempBuf[k] != '\0'; k++) {
*pBuffer = TempBuf[k];
pBuffer++;
}
if (k >= nXfer) { /*ΠΡΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½, ΡΠΈΡΠ°ΡΡ Π΄Π°Π»ΡΡΠ΅*/
nRemainRecv β= nXfer;
} else { /* ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½ ΠΏΡΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ. */
*pBuffer = '\0';
nRemainRecv = 0;
memcpy(p->static_buf, &TempBuf[k + 1], nXfer β k β 1);
p->static_buf_len = nXfer β k β 1;
}
}
return Disconnect;
}
_declspec(dllexport)
BOOL SendCSMessage(RESPONSE *pResponse, SOCKET sd) {
/* ΠΠΎΡΠ»Π°ΡΡ Π·Π°ΠΏΡΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΡ Π² ΡΠΎΠΊΠ΅Ρ sd. */
BOOL Disconnect = FALSE;
LONG32 nRemainSend, nXfer;
LPSTR pBuffer;
pBuffer = pResponse->Record;
nRemainSend = strlen(pBuffer) + 1;
while (nRemainSend > 0 && !Disconnect) {
/* ΠΡΠΏΡΠ°Π²ΠΊΠ° Π΅ΡΠ΅ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΎΡΠ»Π°Π½ΠΎ Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. */
nXfer = send(sd, pBuffer, nRemainSend, 0);
if (nXfer <= 0) {
fprintf(stderr, "\nΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄ΠΎ ΠΏΠΎΡΡΠ»ΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ");
Disconnect = TRUE;
}
nRemainSend β=nXfer;
pBuffer += nXfer;
}
return Disconnect;
}
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ DLL ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Ρ
β’ ΠΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ DllMain Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ DLL_THREAD_ATTACH, Π½ΠΎ Π΄Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ DLL_THREAD_ATTACH Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. Π ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΎΠΏΡΠΈΡ DLL_PROCESS_ATTACH.
β’ ΠΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ (Π²ΠΎΠ·ΡΠΌΠΈΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΠΎΠΊ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ (accept thread)), Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π½Π΅ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ, Π½ΠΎ DllMain Π½Π΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠΎΡΡΠΎΠΌΡ Π½Π° ΡΡΠ°ΡΡΠΊΠ΅ ΠΊΠΎΠ΄Π°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ Π²Π°ΡΠΈΠ°Π½ΡΡ Π²ΡΠ±ΠΎΡΠ° DLL_THREAD_ATTACH, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ Π½Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ; Π·Π΄Π΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ TLS. Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΡΠΊΠΎΠΉ Π²Ρ ΠΎΠ΄Π° ReceiveCSMessage ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π΅Π΅ Π²ΡΠ·ΠΎΠ²Π΅. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½Π°Ρ ΠΏΠ°ΠΌΡΡΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΡΡΠΎΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ΄Π°ΡΡΡΡ, ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠΎΠ²Π½ΠΎ ΡΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΡΡΡΠΎΠ², ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ.
β’ Π₯ΠΎΡΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° DLL ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ, Π»ΡΠ±ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΎΠΊΠ΅ΡΠΎΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄ΠΎΠ»Π³ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π°ΡΡΠΎΡΠΈΠΈΡΡΡΡΡΡ Π½Π΅ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ, Π° Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. ΠΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅.
β’ ΠΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ DLL, ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌ Π½Π° Web-ΡΠ°ΠΉΡΠ΅, ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ Π²ΡΠ²ΠΎΠ΄ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π²ΡΠ·ΠΎΠ²ΠΎΠ² DllMain Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΈΡ ΡΠΈΠΏΠ°ΠΌΠΈ.
β’ ΠΠ°ΠΆΠ΅ ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠΈΡΠΊ ΡΡΠ΅ΡΠΊΠΈ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΌΠΎΠ³ΡΡ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Ρ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ DLL. ΠΠ»Ρ ΠΎΡΡΠ°ΡΡΠΈΡ ΡΡ Π°ΠΊΡΠΈΠ²Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΡΠ½ΠΊΡΠΈΡ ExitProcess Π²ΡΠ·ΠΎΠ²Π΅Ρ DllMain Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ DLL_PROCESS_DETACH, Π° Π½Π΅ DLL_THREAD_DETACH. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² Π½Π΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠ΅ΡΡΡΡΡ, ΠΊΠ°ΠΊ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ. ΠΠΎΡΡΠΎΠΌΡ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΡΠ΅ΡΡΡΡΠΎΠ². Π’ΠΎΠ³Π΄Π° ΡΡΠ°ΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΎΠΏΡΠΈΠΈ DLL_PROCESS_DETACH, ΠΌΠΎΠ³ Π±Ρ Π²Π·ΡΡΡ Π½Π° ΡΠ΅Π±Ρ ΠΏΡΠΎΡΠΌΠΎΡΡ ΡΡΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅Π½ΡΠΆΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ².
ΠΡΠΈΠΌΠ΅Ρ: Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½Π°Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ DLL Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ