windows-hooks-20050418
[openafs.git] / src / WINNT / afsd / afsd.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afs/param.h>
11 #include <afs/stds.h>
12
13 #include <windows.h>
14 #include <string.h>
15 #include <nb30.h>
16
17 #include <osi.h>
18 #include "afsd.h"
19 #include "afsd_init.h"
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <winsock2.h>
23
24 #ifdef _DEBUG
25 #include <crtdbg.h>
26 #endif
27
28 HANDLE main_inst;
29 HWND main_wnd;
30 char main_statusText[100];
31 RECT main_rect;
32 osi_log_t *afsd_logp;
33
34 extern int traceOnPanic;
35
36 extern void afsd_DbgBreakAllocInit();
37 extern void afsd_DbgBreakAdd(DWORD requestNumber);
38
39 HANDLE WaitToTerminate = NULL;
40
41 /*
42  * Notifier function for use by osi_panic
43  */
44 void afsd_notifier(char *msgp, char *filep, long line)
45 {
46         char tbuffer[100];
47         if (filep)
48                 sprintf(tbuffer, "Error at file %s, line %d", filep, line);
49         else
50                 strcpy(tbuffer, "Error at unknown location");
51
52         if (!msgp)
53                 msgp = "Assertion failure";
54
55         MessageBox(NULL, tbuffer, msgp, MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
56
57         afsd_ForceTrace(TRUE);
58         buf_ForceTrace(TRUE);
59
60         if (traceOnPanic) {
61                 _asm int 3h;
62         }
63
64         exit(1);
65 }
66
67 /* Init function called when window application starts.  Inits instance and
68  * application together, since in Win32 they're essentially the same.
69  *
70  * Function then goes into a loop handling user interface messages.  Most are
71  * used to handle redrawing the icon.
72  */
73 int WINAPI WinMain(
74         HINSTANCE hInstance,
75         HINSTANCE hPrevInstance,
76         char *lpCmdLine,
77         int nCmdShow)
78 {
79         MSG msg;
80         
81     afsd_SetUnhandledExceptionFilter();
82        
83 #ifdef _DEBUG
84     afsd_DbgBreakAllocInit();
85     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF /* | _CRTDBG_CHECK_ALWAYS_DF */ | _CRTDBG_CHECK_CRT_DF | _CRTDBG_DELAY_FREE_MEM_DF );
86     if (lpCmdLine)
87     {
88         char *allocRequest = strtok(lpCmdLine, " \t");
89         while (allocRequest)
90         {
91             afsd_DbgBreakAdd(atoi(allocRequest));
92             allocRequest = strtok(NULL, " \t");
93         }
94     }
95 #endif 
96
97     if (!InitClass(hInstance))
98                 return (FALSE);
99
100         if (!InitInstance(hInstance, nCmdShow))
101                 return (FALSE);
102
103         while (GetMessage(&msg, NULL, 0, 0)) {
104                 TranslateMessage(&msg);
105                 DispatchMessage(&msg);
106         }
107         return (msg.wParam);
108 }
109
110
111 /* create the window type for our main window */
112 BOOL InitClass(HANDLE hInstance)
113 {
114         WNDCLASS  wc;
115
116         wc.style = CS_DBLCLKS;          /* double-click messages */
117         wc.lpfnWndProc = (WNDPROC) MainWndProc;
118         wc.cbClsExtra = 0;
119         wc.cbWndExtra = 0;
120         wc.hInstance = hInstance;
121         wc.hIcon = LoadIcon(hInstance, "AFSDIcon");
122         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
123         wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
124         wc.lpszMenuName =  "AFSDMenu";
125         wc.lpszClassName = "AFSDWinClass";
126
127         return (RegisterClass(&wc));
128 }
129
130 /* initialize the process.  Reads the init files to get the appropriate
131  * information. */
132 BOOL InitInstance(
133         HANDLE hInstance,
134         int nCmdShow)
135 {
136         HWND hWnd;
137         HDC hDC;
138         TEXTMETRIC textmetric;
139         INT nLineHeight;
140     long code;
141         char *reason;
142  
143         /* remember this, since it is a useful thing for some of the Windows
144          * calls */
145         main_inst = hInstance;
146
147         /* create our window */
148         hWnd = CreateWindow(
149                 "AFSDWinClass",
150                 "AFSD",
151                 WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,
152                 CW_USEDEFAULT,
153                 CW_USEDEFAULT,
154                 CW_USEDEFAULT,
155                 CW_USEDEFAULT,
156                 NULL,
157                 NULL,
158                 hInstance,
159                 NULL
160         );
161
162         if (!hWnd)
163                 return (FALSE);
164
165         /* lookup text dimensions */
166         hDC = GetDC(hWnd);
167         GetTextMetrics(hDC, &textmetric);
168         nLineHeight = textmetric.tmExternalLeading + textmetric.tmHeight;
169         
170         main_rect.left   = GetDeviceCaps(hDC, LOGPIXELSX) / 4;   /* 1/4 inch */
171         main_rect.right  = GetDeviceCaps(hDC, HORZRES);
172         main_rect.top    = GetDeviceCaps(hDC, LOGPIXELSY) / 4;   /* 1/4 inch */
173         ReleaseDC(hWnd, hDC);
174         main_rect.bottom = main_rect.top + nLineHeight;
175
176         osi_InitPanic(afsd_notifier);
177
178         afsi_start();
179
180         code = afsd_InitCM(&reason);
181         if (code != 0)
182                 osi_panic(reason, __FILE__, __LINE__);
183
184         code = afsd_InitDaemons(&reason);
185         if (code != 0)
186                 osi_panic(reason, __FILE__, __LINE__);
187
188         code = afsd_InitSMB(&reason, MessageBox);
189         if (code != 0)
190                 osi_panic(reason, __FILE__, __LINE__);
191
192         ShowWindow(hWnd, SW_SHOWMINNOACTIVE);
193         UpdateWindow(hWnd);
194         return (TRUE);
195 }
196
197 /* called with no locks with translated messages */
198 LONG APIENTRY MainWndProc(
199         HWND hWnd,
200         unsigned int message,
201         unsigned int wParam,
202         long lParam)
203 {
204         HDC hDC;                         /* display-context variable     */
205         PAINTSTRUCT ps;                  /* paint structure              */
206
207         main_wnd = hWnd;
208
209         switch (message) {
210             case WM_QUERYOPEN:
211                 /* block attempts to open the window */
212                 return 0;
213
214             case WM_COMMAND:
215                 /* LOWORD(wParam) is command */
216                 return (DefWindowProc(hWnd, message, wParam, lParam));
217
218             case WM_CREATE:
219                 break;
220
221             case WM_PAINT:
222                 hDC = BeginPaint (hWnd, &ps);
223                 /* nothing to print, but this clears invalidated rectangle flag */
224                 EndPaint(hWnd, &ps);
225                 break;
226
227             case WM_DESTROY:
228                 RpcMgmtStopServerListening(NULL);
229                 PostQuitMessage(0);
230                 break;
231
232             default:
233                 return (DefWindowProc(hWnd, message, wParam, lParam));
234         }
235         return (0);
236 }