00001
00002
00003
00004
00005
00006
00007
00008
#include "precomp.h"
00009
#pragma hdrstop
00010
00011 BOOL G_bFirstCount =
TRUE;
00012 BADAPP
G_UserBadApp;
00013
00014
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 VOID CtxBadAppDelay(ULONG counttype)
00055 {
00056 ULONG delaycount;
00057
PCLIENTINFO pci;
00058 PTEB pTeb;
00059 LARGE_INTEGER BadAppDelay;
00060
00061 pci =
GetClientInfo();
00062 pTeb = NtCurrentTeb();
00063
if ( (pci !=
NULL) && ((pci->CitrixcSpins) == 0) ) {
00064
G_bFirstCount =
TRUE;
00065 }
00066
00067
if (
G_UserBadApp.BadAppFlags & CITRIX_COMPAT_BADAPPVALID) {
00068
if (
G_bFirstCount) {
00069 delaycount =
G_UserBadApp.BadAppFirstCount;
00070 }
else {
00071 delaycount =
G_UserBadApp.BadAppNthCount;
00072 }
00073 BadAppDelay =
G_UserBadApp.BadAppTimeDelay;
00074 }
else if (pTeb->CtxCompatFlags & CITRIX_COMPAT_BADAPPVALID) {
00075
if (
G_bFirstCount) {
00076 delaycount = pTeb->BadAppFirstCount;
00077 }
else {
00078 delaycount = pTeb->BadAppNthCount;
00079 }
00080 BadAppDelay = pTeb->BadAppTimeDelay;
00081 }
else {
00082
if (
G_bFirstCount) {
00083 delaycount =
gpsi->BadAppFirstCount;
00084 }
00085
else delaycount =
gpsi->BadAppNthCount;
00086 BadAppDelay =
gpsi->BadAppTimeDelay;
00087 }
00088
00089
if ( (pTeb->CitrixTEBcSpins) > delaycount ) {
00090 (pTeb->CitrixTEBcSpins) = 0;
00091
00092
#ifdef BADAPPTRACE
00093
if (counttype) {
00094
DbgPrint(
"j.k. CtxBadAppDelay YIELD, bFirstCount=%u\n",(ULONG) bFirstCount);
00095 }
00096
else DbgPrint(
"j.k. CtxBadAppDelay PEEK, bFirstCount=%u\n",(ULONG) bFirstCount);
00097
#endif
00098
00099
G_bFirstCount =
FALSE;
00100
NtDelayExecution(
00101
FALSE,
00102 &BadAppDelay);
00103 }
00104
return;
00105 UNREFERENCED_PARAMETER(counttype);
00106 }
00107
00108
00109
00110
00111
00112
BOOL
00113 CtxUserYieldTask( VOID )
00114 {
00115 ULONG cSpins;
00116
PCLIENTINFO pci;
00117
BOOL Result;
00118
00119
00120
00121 pci =
GetClientInfo();
00122
if (pci !=
NULL) {
00123 cSpins = pci->CitrixcSpins;
00124 }
00125
00126 Result =
NtUserYieldTask();
00127
00128
if ( pci !=
NULL) {
00129
if (cSpins >= pci->CitrixcSpins) {
00130
00131 (NtCurrentTeb()->CitrixTEBcSpins) = pci->CitrixcSpins;
00132 }
00133
else {
00134 (NtCurrentTeb()->CitrixTEBcSpins) += pci->CitrixcSpins - cSpins;
00135
CtxBadAppDelay(1);
00136 }
00137 }
00138
00139
return( Result );
00140 }
00141
00142
00143
00144
00145
00146
BOOL
00147 CtxUserWaitMessage( VOID )
00148 {
00149
00150
G_bFirstCount =
TRUE;
00151
00152
return (
NtUserWaitMessage() );
00153 }