ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/CCSFinger/CCSFinger.cpp
(Generate patch)

Comparing CCSFinger/CCSFinger.cpp (file contents):
Revision 595 by douglas, 2005-11-27T17:57:41-08:00 vs.
Revision 608 by douglas, 2005-11-30T18:23:39-08:00

# Line 6 | Line 6
6  
7   #include <windows.h>
8   #include <tchar.h>
9 + #include <signal.h>
10 + #include <wtsapi32.h>
11  
12   #include <iostream>
13 + #include <string>
14  
15   LPTSTR name;
16   SERVICE_STATUS status;
# Line 15 | Line 18 | SERVICE_STATUS_HANDLE handle;
18   HANDLE stop;
19   WSADATA data;
20  
21 + void FingerDaemon();
22 + void FingerStop(int);
23   void WINAPI FingerMain(DWORD argc, LPTSTR *argv);
24   void WINAPI FingerControl(DWORD control);
25  
26   int _tmain(int argc, TCHAR *argv[])
27   {
28 <        SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
28 >        PWTS_SESSION_INFO sessions;
29 >        DWORD count;
30 >
31 >        if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &count))
32 >        {
33 >                std::cerr << GetLastError() << std::endl;
34 >
35 >                return 1;
36 >        }
37 >
38 >        for (PWTS_SESSION_INFO session = sessions; session != sessions + count; ++session)
39 >        {
40 >                LPTSTR userName, clientName;
41 >                DWORD userNameSize, clientNameSize;
42 >
43 >                WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSUserName, &userName, &userNameSize);
44 >                WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSClientName, &clientName, &clientNameSize);
45 >
46 >                std::wcout << '{' << std::endl
47 >                        << '\t' << session->SessionId << std::endl
48 >                        << '\t' << session->pWinStationName << std::endl
49 >                        << '\t';
50 >
51 >                switch (session->State)
52 >                {
53 >                case WTSActive:
54 >                        std::cout << "Active";
55 >                        
56 >                        break;
57 >                case WTSConnected:
58 >                        std::cout << "Connected";
59 >
60 >                        break;
61 >                case WTSConnectQuery:
62 >                        std::cout << "Connect Query";
63 >
64 >                        break;
65 >                case WTSShadow:
66 >                        std::cout << "Shadow";
67 >
68 >                        break;
69 >                case WTSDisconnected:
70 >                        std::cout << "Disconnected";
71 >
72 >                        break;
73 >                case WTSIdle:
74 >                        std::cout << "Idle";
75 >
76 >                        break;
77 >                case WTSListen:
78 >                        std::cout << "Listen";
79 >
80 >                        break;
81 >                case WTSReset:
82 >                        std::cout << "Reset";
83 >
84 >                        break;
85 >                case WTSDown:
86 >                        std::cout << "Down";
87 >
88 >                        break;
89 >                case WTSInit:
90 >                        std::cout << "Init";
91 >
92 >                        break;
93 >                }
94 >
95 >                std::wcout << std::endl << '\t' << userName << std::endl
96 >                        << '\t' << clientName << std::endl
97 >                        << '}' << std::endl;
98 >
99 >                WTSFreeMemory(userName);
100 >                WTSFreeMemory(clientName);
101 >        }
102 >
103 >        WTSFreeMemory(sessions);
104 >
105 >        /*SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
106  
107          if (!StartServiceCtrlDispatcher(entry))
108          {
# Line 51 | Line 133 | int _tmain(int argc, TCHAR *argv[])
133          return 0;
134  
135   go:
136 <        std::cout << "Here!" << std::endl;
136 >        stop = CreateEvent(NULL, TRUE, FALSE, NULL);
137  
138 <        return 0;
138 >        signal(SIGINT, FingerStop);
139 >
140 >        try
141 >        {
142 >                FingerDaemon();
143 >        }
144 >        catch (...) {}
145 >
146 >        return 0;*/
147 > }
148 >
149 > void FingerDaemon()
150 > {
151 >        WSAStartup(MAKEWORD(2, 0), &data);
152 >
153 >        //
154 >
155 >        SOCKET server(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
156 >        SOCKADDR_IN service;
157 >        
158 >        service.sin_family = AF_INET;
159 >        service.sin_addr.s_addr = inet_addr("0.0.0.0");
160 >        service.sin_port = htons(79);
161 >
162 >        bind(server, (SOCKADDR *)(&service), sizeof (service));
163 >        listen(server, SOMAXCONN);
164 >
165 >        SOCKET client;
166 >
167 >        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 && (client = accept(server, NULL, NULL)) == SOCKET_ERROR)
168 >        {
169 >                //
170 >        }
171 >
172 >        //
173 >
174 >        closesocket(server);
175 >
176 >        WSACleanup();
177 > }
178 >
179 > void FingerStop(int)
180 > {
181 >        SetEvent(stop);
182 >
183 >        std::cout << "Stop!" << std::endl;
184   }
185  
186   void WINAPI FingerMain(DWORD argc, LPTSTR *argv)
# Line 64 | Line 191 | void WINAPI FingerMain(DWORD argc, LPTST
191  
192          //
193  
67        WSAStartup(MAKEWORD(2, 0), &data);
68
69        //
70
194          status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
195          status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
196          status.dwServiceSpecificExitCode = 0;
# Line 78 | Line 201 | void WINAPI FingerMain(DWORD argc, LPTST
201  
202          SetServiceStatus(handle, &status);
203  
204 <        SOCKET sock(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
82 <        SOCKADDR_IN service;
83 <        
84 <        service.sin_family = AF_INET;
85 <        service.sin_addr.s_addr = inet_addr("0.0.0.0");
86 <        service.sin_port = htons(79);
87 <
88 <        bind(sock, (SOCKADDR *)(&service), sizeof (service));
89 <        listen(sock, SOMAXCONN);
90 <
91 <        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 /*&&*/)
204 >        try
205          {
206 <                //
206 >                FingerDaemon();
207          }
208 <
96 <        //
97 <
98 <        WSACleanup();
208 >        catch (...) {}
209  
210          status.dwCurrentState = SERVICE_STOPPED;
211          status.dwWin32ExitCode = NO_ERROR;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines