@@ -208,8 +208,21 @@ NetrWkstaGetInfo(
208208 * WkstaInfo = pWkstaInfo ;
209209 break ;
210210
211+ case 502 :
212+ pWkstaInfo = midl_user_allocate (sizeof (WKSTA_INFO_502 ));
213+ if (pWkstaInfo == NULL )
214+ {
215+ dwResult = ERROR_NOT_ENOUGH_MEMORY ;
216+ break ;
217+ }
218+
219+ CopyMemory (& pWkstaInfo -> WkstaInfo502 , & WkstaInfo502 , sizeof (WKSTA_INFO_502 ));
220+
221+ * WkstaInfo = pWkstaInfo ;
222+ break ;
223+
211224 default :
212- FIXME ("Level %d unimplemented\n" , Level );
225+ FIXME ("Level %lu unimplemented\n" , Level );
213226 dwResult = ERROR_INVALID_LEVEL ;
214227 break ;
215228 }
@@ -230,8 +243,107 @@ NetrWkstaSetInfo(
230243 LPWKSTA_INFO WkstaInfo ,
231244 unsigned long * ErrorParameter )
232245{
233- UNIMPLEMENTED ;
234- return 0 ;
246+ DWORD dwResult = NERR_Success ;
247+
248+ TRACE ("NetrWkstaSetInfo(%lu %p %p)\n" ,
249+ Level , WkstaInfo , ErrorParameter );
250+
251+ switch (Level )
252+ {
253+ case 502 :
254+ if (WkstaInfo -> WkstaInfo502 .wki502_keep_conn >= 1 && WkstaInfo -> WkstaInfo502 .wki502_keep_conn <= 65535 )
255+ {
256+ WkstaInfo502 .wki502_keep_conn = WkstaInfo -> WkstaInfo502 .wki502_keep_conn ;
257+
258+ if (WkstaInfo -> WkstaInfo502 .wki502_max_cmds >= 50 && WkstaInfo -> WkstaInfo502 .wki502_max_cmds <= 65535 )
259+ {
260+ WkstaInfo502 .wki502_max_cmds = WkstaInfo -> WkstaInfo502 .wki502_max_cmds ;
261+
262+ if (WkstaInfo -> WkstaInfo502 .wki502_sess_timeout >= 60 && WkstaInfo -> WkstaInfo502 .wki502_sess_timeout <= 65535 )
263+ {
264+ WkstaInfo502 .wki502_sess_timeout = WkstaInfo -> WkstaInfo502 .wki502_sess_timeout ;
265+
266+ if (WkstaInfo -> WkstaInfo502 .wki502_dormant_file_limit != 0 )
267+ {
268+ WkstaInfo502 .wki502_dormant_file_limit = WkstaInfo -> WkstaInfo502 .wki502_dormant_file_limit ;
269+ }
270+ else
271+ {
272+ if (ErrorParameter )
273+ * ErrorParameter = WKSTA_DORMANTFILELIMIT_PARMNUM ;
274+ dwResult = ERROR_INVALID_PARAMETER ;
275+ }
276+ }
277+ else
278+ {
279+ if (ErrorParameter )
280+ * ErrorParameter = WKSTA_SESSTIMEOUT_PARMNUM ;
281+ dwResult = ERROR_INVALID_PARAMETER ;
282+ }
283+ }
284+ else
285+ {
286+ if (ErrorParameter )
287+ * ErrorParameter = WKSTA_MAXCMDS_PARMNUM ;
288+ dwResult = ERROR_INVALID_PARAMETER ;
289+ }
290+ }
291+ else
292+ {
293+ if (ErrorParameter )
294+ * ErrorParameter = WKSTA_KEEPCONN_PARMNUM ;
295+ dwResult = ERROR_INVALID_PARAMETER ;
296+ }
297+ break ;
298+
299+ case 1013 :
300+ if (WkstaInfo -> WkstaInfo1013 .wki1013_keep_conn >= 1 && WkstaInfo -> WkstaInfo1013 .wki1013_keep_conn <= 65535 )
301+ {
302+ WkstaInfo502 .wki502_keep_conn = WkstaInfo -> WkstaInfo1013 .wki1013_keep_conn ;
303+ }
304+ else
305+ {
306+ if (ErrorParameter )
307+ * ErrorParameter = WKSTA_KEEPCONN_PARMNUM ;
308+ dwResult = ERROR_INVALID_PARAMETER ;
309+ }
310+ break ;
311+
312+ case 1018 :
313+ if (WkstaInfo -> WkstaInfo1018 .wki1018_sess_timeout >= 60 && WkstaInfo -> WkstaInfo1018 .wki1018_sess_timeout <= 65535 )
314+ {
315+ WkstaInfo502 .wki502_sess_timeout = WkstaInfo -> WkstaInfo1018 .wki1018_sess_timeout ;
316+ }
317+ else
318+ {
319+ if (ErrorParameter )
320+ * ErrorParameter = WKSTA_SESSTIMEOUT_PARMNUM ;
321+ dwResult = ERROR_INVALID_PARAMETER ;
322+ }
323+ break ;
324+
325+ case 1046 :
326+ if (WkstaInfo -> WkstaInfo1046 .wki1046_dormant_file_limit != 0 )
327+ {
328+ WkstaInfo502 .wki502_dormant_file_limit = WkstaInfo -> WkstaInfo1046 .wki1046_dormant_file_limit ;
329+ }
330+ else
331+ {
332+ if (ErrorParameter )
333+ * ErrorParameter = WKSTA_DORMANTFILELIMIT_PARMNUM ;
334+ dwResult = ERROR_INVALID_PARAMETER ;
335+ }
336+ break ;
337+
338+ default :
339+ FIXME ("Level %lu unimplemented\n" , Level );
340+ dwResult = ERROR_INVALID_LEVEL ;
341+ break ;
342+ }
343+
344+ /* FIXME: Store the workstation info in the registry */
345+
346+ return dwResult ;
235347}
236348
237349
0 commit comments