31 |
HHOOK hWndProc = 0; |
HHOOK hWndProc = 0; |
32 |
HINSTANCE hInst = 0; |
HINSTANCE hInst = 0; |
33 |
HANDLE m_vcHandle = 0; |
HANDLE m_vcHandle = 0; |
34 |
|
HANDLE hMutex = 0; |
35 |
|
|
36 |
void SendDebug( char *format, ... ) |
void SendDebug( char *format, ... ) |
37 |
{ |
{ |
52 |
extern "C" BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpReserved ) |
extern "C" BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID lpReserved ) |
53 |
{ |
{ |
54 |
switch ( ul_reason_for_call ) { |
switch ( ul_reason_for_call ) { |
55 |
case DLL_PROCESS_ATTACH: { |
case DLL_PROCESS_ATTACH: |
56 |
// remember our instance handle |
// remember our instance handle |
57 |
hInst = hinstDLL; |
hInst = hinstDLL; |
58 |
++iInstanceCount; |
|
59 |
OpenVirtualChannel(); |
hMutex = CreateMutex( NULL, FALSE, "Local\\Seamless" ); |
60 |
break; |
if (!hMutex) |
61 |
} |
return FALSE; |
62 |
|
|
63 |
|
WaitForSingleObject( hMutex, INFINITE ); |
64 |
|
++iInstanceCount; |
65 |
|
ReleaseMutex( hMutex ); |
66 |
|
|
67 |
|
OpenVirtualChannel(); |
68 |
|
|
69 |
|
break; |
70 |
|
|
71 |
case DLL_THREAD_ATTACH: |
case DLL_THREAD_ATTACH: |
72 |
break; |
break; |
73 |
|
|
74 |
case DLL_THREAD_DETACH: |
case DLL_THREAD_DETACH: |
75 |
break; |
break; |
76 |
case DLL_PROCESS_DETACH: { |
|
77 |
--iInstanceCount; |
case DLL_PROCESS_DETACH: |
78 |
CloseVirtualChannel(); |
WaitForSingleObject( hMutex, INFINITE ); |
79 |
} |
--iInstanceCount; |
80 |
|
ReleaseMutex( hMutex ); |
81 |
|
|
82 |
|
CloseVirtualChannel(); |
83 |
|
|
84 |
|
CloseHandle( hMutex ); |
85 |
|
|
86 |
break; |
break; |
87 |
} |
} |
88 |
|
|
456 |
|
|
457 |
int WriteToChannel( PCHAR buffer ) |
int WriteToChannel( PCHAR buffer ) |
458 |
{ |
{ |
459 |
|
BOOL result; |
460 |
PULONG bytesRead = 0; |
PULONG bytesRead = 0; |
461 |
PULONG pBytesWritten = 0; |
PULONG pBytesWritten = 0; |
462 |
|
|
463 |
if ( !ChannelIsOpen() ) |
if ( !ChannelIsOpen() ) |
464 |
return 1; |
return 1; |
465 |
|
|
466 |
BOOL result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten ); |
WaitForSingleObject( hMutex, INFINITE ); |
467 |
|
result = WTSVirtualChannelWrite( m_vcHandle, buffer, ( ULONG ) strlen( buffer ), pBytesWritten ); |
468 |
|
ReleaseMutex( hMutex ); |
469 |
|
|
470 |
if ( result ) { |
if ( result ) { |
471 |
return 1; |
return 1; |