ReactOS  0.4.15-dev-2704-gd5265b0
nfs41_np.c
Go to the documentation of this file.
1 /* NFSv4.1 client for Windows
2  * Copyright © 2012 The Regents of the University of Michigan
3  *
4  * Olga Kornievskaia <aglo@umich.edu>
5  * Casey Bodley <cbodley@umich.edu>
6  *
7  * This library is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful, but
13  * without any warranty; without even the implied warranty of merchantability
14  * or fitness for a particular purpose. See the GNU Lesser General Public
15  * License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this library; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  */
21 
22 #include <windows.h>
23 #include <npapi.h>
24 #include <devioctl.h>
25 #include <strsafe.h>
26 
27 #include "nfs41_driver.h"
28 #include "nfs41_np.h"
29 #include "options.h"
30 
31 #include <pseh/pseh2.h>
32 
33 #ifdef DBG
34 #define DbgP(_x_) NFS41DbgPrint _x_
35 #else
36 #define DbgP(_x_)
37 #endif
38 #define TRACE_TAG L"[NFS41_NP]"
39 #define WNNC_DRIVER( major, minor ) ( major * 0x00010000 + minor )
40 
41 
43 {
44  ULONG rc = 0;
45  TCHAR szbuffer[256];
46 
49  {
50 
51  //StringCchVPrintfW( szbuffer, 127, Format, marker );
52  StringCchVPrintfW( szbuffer, 256, Format, marker );
53  szbuffer[255] = (TCHAR)0;
55  OutputDebugString( szbuffer );
56  }
57 
58  return rc;
59 }
60 
61 int filter(unsigned int code)
62 {
63  DbgP((L"####Got exception %u\n", code));
65 }
66 
67 DWORD
69  PHANDLE phMutex,
70  PHANDLE phMemory,
71  PVOID *pMemory)
72 /*++
73 
74 Routine Description:
75 
76  This routine opens the shared memory for exclusive manipulation
77 
78 Arguments:
79 
80  phMutex - the mutex handle
81 
82  phMemory - the memory handle
83 
84  pMemory - a ptr. to the shared memory which is set if successful
85 
86 Return Value:
87 
88  WN_SUCCESS -- if successful
89 
90 --*/
91 {
93 
94  *phMutex = 0;
95  *phMemory = 0;
96  *pMemory = NULL;
97 
99  if (*phMutex == NULL)
100  {
102  DbgP((TEXT("OpenSharedMemory: OpenMutex failed\n")));
103  goto OpenSharedMemoryAbort1;
104  }
105 
106  WaitForSingleObject(*phMutex, INFINITE);
107 
108  *phMemory = OpenFileMapping(FILE_MAP_WRITE,
109  FALSE,
111  if (*phMemory == NULL)
112  {
114  DbgP((TEXT("OpenSharedMemory: OpenFileMapping failed\n")));
115  goto OpenSharedMemoryAbort2;
116  }
117 
118  *pMemory = MapViewOfFile(*phMemory, FILE_MAP_WRITE, 0, 0, 0);
119  if (*pMemory == NULL)
120  {
122  DbgP((TEXT("OpenSharedMemory: MapViewOfFile failed\n")));
123  goto OpenSharedMemoryAbort3;
124  }
125 
126  return ERROR_SUCCESS;
127 
128 OpenSharedMemoryAbort3:
129  CloseHandle(*phMemory);
130 
131 OpenSharedMemoryAbort2:
132  ReleaseMutex(*phMutex);
133  CloseHandle(*phMutex);
134  *phMutex = NULL;
135 
136 OpenSharedMemoryAbort1:
137  DbgP((TEXT("OpenSharedMemory: return dwStatus: %d\n"), dwStatus));
138 
139  return dwStatus;
140 }
141 
142 VOID
144  PHANDLE hMutex,
146  PVOID *pMemory)
147 /*++
148 
149 Routine Description:
150 
151  This routine relinquishes control of the shared memory after exclusive
152  manipulation
153 
154 Arguments:
155 
156  hMutex - the mutex handle
157 
158  hMemory - the memory handle
159 
160  pMemory - a ptr. to the shared memory which is set if successful
161 
162 Return Value:
163 
164 --*/
165 {
166  if (*pMemory)
167  {
169  *pMemory = NULL;
170  }
171  if (*hMemory)
172  {
174  *hMemory = 0;
175  }
176  if (*hMutex)
177  {
178  if (ReleaseMutex(*hMutex) == FALSE)
179  {
180  DbgP((TEXT("CloseSharedMemory: ReleaseMutex error: %d\n"), GetLastError()));
181  }
183  *hMutex = 0;
184  }
185 }
186 
188  IN LPCWSTR LocalName,
189  IN LPCWSTR ConnectionName,
190  IN USHORT ConnectionNameLength,
191  IN LPNETRESOURCE lpNetResource)
192 {
193  DWORD status;
195  PNFS41NP_SHARED_MEMORY pSharedMemory;
196  PNFS41NP_NETRESOURCE pNfs41NetResource;
197  INT Index;
198  BOOLEAN FreeEntryFound = FALSE;
199 
200 #ifdef __REACTOS__
201  status = OpenSharedMemory(&hMutex, &hMemory, (PVOID *)&pSharedMemory);
202 #else
203  status = OpenSharedMemory(&hMutex, &hMemory, &(PVOID)pSharedMemory);
204 #endif
205  if (status)
206  goto out;
207 
208  DbgP((TEXT("StoreConnectionInfo: NextIndex %d, NumResources %d\n"),
209  pSharedMemory->NextAvailableIndex,
210  pSharedMemory->NumberOfResourcesInUse));
211 
212  for (Index = 0; Index < pSharedMemory->NextAvailableIndex; Index++)
213  {
214  if (!pSharedMemory->NetResources[Index].InUse)
215  {
216  FreeEntryFound = TRUE;
217  DbgP((TEXT("Reusing existing index %d\n"), Index));
218  break;
219  }
220  }
221 
222  if (!FreeEntryFound)
223  {
224  if (pSharedMemory->NextAvailableIndex >= NFS41NP_MAX_DEVICES) {
226  goto out_close;
227  }
228  Index = pSharedMemory->NextAvailableIndex++;
229  DbgP((TEXT("Using new index %d\n"), Index));
230  }
231 
232  pSharedMemory->NumberOfResourcesInUse += 1;
233 
234  pNfs41NetResource = &pSharedMemory->NetResources[Index];
235 
236  pNfs41NetResource->InUse = TRUE;
237  pNfs41NetResource->dwScope = lpNetResource->dwScope;
238  pNfs41NetResource->dwType = lpNetResource->dwType;
239  pNfs41NetResource->dwDisplayType = lpNetResource->dwDisplayType;
240  pNfs41NetResource->dwUsage = RESOURCEUSAGE_CONNECTABLE;
241  pNfs41NetResource->LocalNameLength = (USHORT)(wcslen(LocalName) + 1) * sizeof(WCHAR);
242  pNfs41NetResource->RemoteNameLength = (USHORT)(wcslen(lpNetResource->lpRemoteName) + 1) * sizeof(WCHAR);
243  pNfs41NetResource->ConnectionNameLength = ConnectionNameLength;
244 
245  StringCchCopy(pNfs41NetResource->LocalName,
246  pNfs41NetResource->LocalNameLength,
247  LocalName);
248  StringCchCopy(pNfs41NetResource->RemoteName,
249  pNfs41NetResource->RemoteNameLength,
250  lpNetResource->lpRemoteName);
251  StringCchCopy(pNfs41NetResource->ConnectionName,
252  pNfs41NetResource->ConnectionNameLength,
253  ConnectionName);
254 
255  // TODO: copy mount options -cbodley
256 
257 out_close:
258 #ifdef __REACTOS__
259  CloseSharedMemory(&hMutex, &hMemory, (PVOID *)&pSharedMemory);
260 #else
261  CloseSharedMemory(&hMutex, &hMemory, &(PVOID)pSharedMemory);
262 #endif
263 out:
264  return status;
265 }
266 
267 ULONG
270  IN PVOID InputDataBuf,
271  IN ULONG InputDataLen,
272  IN PVOID OutputDataBuf,
273  IN PULONG pOutputDataLen)
274 {
275  HANDLE DeviceHandle; // The mini rdr device handle
276  BOOL rc = FALSE;
277  ULONG Status;
278 
279  Status = WN_SUCCESS;
280  DbgP((L"[aglo] calling CreateFile\n"));
287  0,
288  (HANDLE) NULL );
289 
290  DbgP((L"[aglo] after CreateFile Device Handle\n"));
292  {
293  _SEH2_TRY {
294  DbgP((L"[aglo] calling DeviceIoControl\n"));
295  rc = DeviceIoControl(
296  DeviceHandle,
297  IoctlCode,
298  InputDataBuf,
299  InputDataLen,
300  OutputDataBuf,
301  *pOutputDataLen,
302  pOutputDataLen,
303  NULL );
305  DbgP((L"#### In except\n"));
306  } _SEH2_END;
307  DbgP((L"[aglo] returned from DeviceIoControl %08lx\n", rc));
308  if ( !rc )
309  {
310  DbgP((L"[aglo] SendTo_NFS41Driver: returning error from DeviceIoctl\n"));
311  Status = GetLastError( );
312  }
313  else
314  {
315  DbgP((L"[aglo] SendTo_NFS41Driver: The DeviceIoctl call succeded\n"));
316  }
318  }
319  else
320  {
321  Status = GetLastError( );
322  DbgP((L"[aglo] SendTo_NFS41Driver: error %08lx opening device \n", Status));
323  }
324  DbgP((L"[aglo] returned from SendTo_NFS41Driver %08lx\n", Status));
325  return Status;
326 }
327 
330  DWORD nIndex )
331 {
332  DWORD rc = 0;
333 
334 #ifndef __REACTOS__
335  DbgP(( L"[aglo] GetNetCaps %d\n", nIndex ));
336 #endif
337  switch ( nIndex )
338  {
339  case WNNC_SPEC_VERSION:
340  rc = WNNC_SPEC_VERSION51;
341  break;
342 
343  case WNNC_NET_TYPE:
344  rc = WNNC_NET_RDR2SAMPLE;
345  break;
346 
347  case WNNC_DRIVER_VERSION:
348  rc = WNNC_DRIVER(1, 0);
349  break;
350 
351  case WNNC_CONNECTION:
356  break;
357 
358  case WNNC_ENUMERATION:
359  rc = WNNC_ENUM_LOCAL;
360  break;
361 
362  case WNNC_START:
363  rc = 1;
364  break;
365 
366  case WNNC_USER:
367  case WNNC_DIALOG:
368  case WNNC_ADMIN:
369  default:
370  rc = 0;
371  break;
372  }
373 
374  return rc;
375 }
376 
379  __in PLUID lpLogonId,
380  __in PCWSTR lpAuthentInfoType,
381  __in PVOID lpAuthentInfo,
382  __in PCWSTR lpPreviousAuthentInfoType,
383  __in PVOID lpPreviousAuthentInfo,
384  __in PWSTR lpStationName,
385  __in PVOID StationHandle,
386  __out PWSTR *lpLogonScript)
387 {
388  *lpLogonScript = NULL;
389  DbgP(( L"[aglo] NPLogonNotify: returning WN_SUCCESS\n" ));
390  return WN_SUCCESS;
391 }
392 
395  __in LPCWSTR lpAuthentInfoType,
396  __in LPVOID lpAuthentInfo,
397  __in LPCWSTR lpPreviousAuthentInfoType,
398  __in LPVOID lpPreviousAuthentInfo,
399  __in LPWSTR lpStationName,
400  LPVOID StationHandle,
401  DWORD dwChangeInfo )
402 {
403  DbgP(( L"[aglo] NPPasswordChangeNotify: WN_NOT_SUPPORTED\n" ));
405  return WN_NOT_SUPPORTED;
406 }
407 
408 #ifdef __REACTOS__
411  __in HWND hwndOwner,
412  __in LPNETRESOURCE lpNetResource,
413  __in_opt LPWSTR lpPassword,
414  __in_opt LPWSTR lpUserName,
415  __in DWORD dwFlags);
416 #endif
417 
420  __in LPNETRESOURCE lpNetResource,
421  __in_opt LPWSTR lpPassword,
422  __in_opt LPWSTR lpUserName )
423 {
424  return NPAddConnection3( NULL, lpNetResource, lpPassword, lpUserName, 0 );
425 }
426 
429  __in HWND hwndOwner,
430  __in LPNETRESOURCE lpNetResource,
431  __in_opt LPWSTR lpPassword,
432  __in_opt LPWSTR lpUserName,
434 {
435  DWORD Status;
436  WCHAR wszScratch[128];
437  WCHAR LocalName[3];
438  DWORD CopyBytes = 0;
439  CONNECTION_INFO Connection;
440  LPWSTR ConnectionName;
441  WCHAR ServerName[MAX_PATH];
442  PWCHAR p;
443  DWORD i;
444 
445  DbgP(( L"[aglo] NPAddConnection3('%s', '%s')\n",
446  lpNetResource->lpLocalName, lpNetResource->lpRemoteName ));
447  DbgP(( L"[aglo] username = '%s', passwd = '%s'\n", lpUserName, lpPassword));
448 
449  Status = InitializeConnectionInfo(&Connection,
450  (PMOUNT_OPTION_BUFFER)lpNetResource->lpComment,
451  &ConnectionName);
452  if (Status) {
453  DbgP(( L"InitializeConnectionInfo failed with %d\n", Status ));
454  goto out;
455  }
456 
457  // \device\miniredirector\;<DriveLetter>:\Server\Share
458 
459  // local name, must start with "X:"
460  if (lstrlen(lpNetResource->lpLocalName) < 2 ||
461  lpNetResource->lpLocalName[1] != L':') {
463  goto out;
464  }
465 
466  LocalName[0] = (WCHAR) toupper(lpNetResource->lpLocalName[0]);
467  LocalName[1] = L':';
468  LocalName[2] = L'\0';
469  StringCchCopyW( ConnectionName, MAX_PATH, NFS41_DEVICE_NAME );
470  StringCchCatW( ConnectionName, MAX_PATH, L"\\;" );
471  StringCchCatW( ConnectionName, MAX_PATH, LocalName );
472 
473  // remote name, must start with "\\"
474  if (lpNetResource->lpRemoteName[0] == L'\0' ||
475  lpNetResource->lpRemoteName[0] != L'\\' ||
476  lpNetResource->lpRemoteName[1] != L'\\') {
478  goto out;
479  }
480 
481  /* note: remotename comes as \\server but we need to add \server thus +1 pointer */
482  p = lpNetResource->lpRemoteName + 1;
483  ServerName[0] = L'\\';
484  i = 1;
485  for(;;) {
486  /* convert servername ending unix slash to windows slash */
487  if (p[i] == L'/')
488  p[i] = L'\\';
489  /* deal with servername ending with any slash */
490  if (p[i] == L'\0')
491  p[i] = L'\\';
492  ServerName[i] = p[i];
493  if (p[i] == L'\\') break;
494  i++;
495  }
496  ServerName[i] = L'\0';
497  StringCchCatW( ConnectionName, MAX_PATH, ServerName);
498  /* insert the "nfs4" in between the server name and the path,
499  * just to make sure all calls to our driver come thru this */
500  StringCchCatW( ConnectionName, MAX_PATH, L"\\nfs4" );
501 
502 #ifdef CONVERT_2_UNIX_SLASHES
503  /* convert all windows slashes to unix slashes */
504  {
505  PWCHAR q = p;
506  DWORD j = 0;
507  for(;;) {
508  if(q[j] == L'\0') break;
509  if (q[j] == L'\\') q[j] = L'/';
510  j++;
511  }
512  }
513 #else
514  /* convert all unix slashes to windows slashes */
515  {
516  PWCHAR q = p;
517  DWORD j = 0;
518  for(;;) {
519  if(q[j] == L'\0') break;
520  if (q[j] == L'/') q[j] = L'\\';
521  j++;
522  }
523  }
524 #endif
525  StringCchCatW( ConnectionName, MAX_PATH, &p[i]);
526  DbgP(( L"[aglo] Full Connect Name: %s\n", ConnectionName ));
527  DbgP(( L"[aglo] Full Connect Name Length: %d %d\n",
528  (wcslen(ConnectionName) + 1) * sizeof(WCHAR),
529  (lstrlen(ConnectionName) + 1) * sizeof(WCHAR)));
530 
531  if ( QueryDosDevice( LocalName, wszScratch, 128 )
534  goto out;
535  }
536 
537  MarshalConnectionInfo(&Connection);
538 
540  Connection.Buffer, Connection.BufferSize,
541  NULL, &CopyBytes );
542  if (Status) {
543  DbgP(( L"[aglo] SendTo_NFS41Driver failed with %d\n", Status));
544  goto out;
545  }
546 
547  DbgP(( L"[aglo] calling DefineDosDevice\n"));
550  lpNetResource->lpLocalName,
551  ConnectionName ) ) {
552  Status = GetLastError();
553  DbgP(( L"[aglo] DefineDosDevice failed with %d\n", Status));
554  goto out_delconn;
555  }
556 
557  // The connection was established and the local device mapping
558  // added. Include this in the list of mapped devices.
559  Status = StoreConnectionInfo(LocalName, ConnectionName,
560  Connection.Buffer->NameLength, lpNetResource);
561  if (Status) {
562  DbgP(( L"[aglo] StoreConnectionInfo failed with %d\n", Status));
563  goto out_undefine;
564  }
565 
566 out:
567  FreeConnectionInfo(&Connection);
568  DbgP(( L"[aglo] NPAddConnection3: status %08X\n", Status));
569  return Status;
570 out_undefine:
572  DDD_EXACT_MATCH_ON_REMOVE, LocalName, ConnectionName);
573 out_delconn:
574  SendTo_NFS41Driver(IOCTL_NFS41_DELCONN, ConnectionName,
575  Connection.Buffer->NameLength, NULL, &CopyBytes);
576  goto out;
577 }
578 
582  __in BOOL fForce )
583 {
584  DWORD Status = 0;
585 
587  PNFS41NP_SHARED_MEMORY pSharedMemory;
588 
589  DbgP((TEXT("NPCancelConnection\n")));
590  DbgP((TEXT("NPCancelConnection: ConnectionName: %S\n"), lpName));
591 
593  &hMemory,
594  (PVOID)&pSharedMemory);
595 
596  if (Status == WN_SUCCESS)
597  {
598  INT Index;
599  PNFS41NP_NETRESOURCE pNetResource;
601 
602  DbgP((TEXT("NPCancelConnection: NextIndex %d, NumResources %d\n"),
603  pSharedMemory->NextAvailableIndex,
604  pSharedMemory->NumberOfResourcesInUse));
605 
606  for (Index = 0; Index < pSharedMemory->NextAvailableIndex; Index++)
607  {
608  pNetResource = &pSharedMemory->NetResources[Index];
609 
610  if (pNetResource->InUse)
611  {
612  if ( ( (wcslen(lpName) + 1) * sizeof(WCHAR) ==
613  pNetResource->LocalNameLength)
614  && ( !wcscmp(lpName, pNetResource->LocalName) ))
615  {
616  ULONG CopyBytes;
617 
618  DbgP((TEXT("NPCancelConnection: Connection Found:\n")));
619 
620  CopyBytes = 0;
621 
623  pNetResource->ConnectionName,
624  pNetResource->ConnectionNameLength,
625  NULL,
626  &CopyBytes );
627 
628  if (Status != WN_SUCCESS)
629  {
630  DbgP((TEXT("NPCancelConnection: SendToMiniRdr returned Status %lx\n"),Status));
631  break;
632  }
633 
635  lpName,
636  pNetResource->ConnectionName) == FALSE)
637  {
638  DbgP((TEXT("RemoveDosDevice: DefineDosDevice error: %d\n"), GetLastError()));
639  Status = GetLastError();
640  }
641  else
642  {
643  pNetResource->InUse = FALSE;
644  pSharedMemory->NumberOfResourcesInUse--;
645 
646  if (Index+1 == pSharedMemory->NextAvailableIndex)
647  pSharedMemory->NextAvailableIndex--;
648  }
649  break;
650  }
651 
652  DbgP((TEXT("NPCancelConnection: Name %S EntryName %S\n"),
653  lpName,pNetResource->LocalName));
654 #ifndef __REACTOS__
655  DbgP((TEXT("NPCancelConnection: Name Length %d Entry Name Length %d\n"),
656  pNetResource->LocalNameLength,pNetResource->LocalName));
657 #else
658  DbgP((TEXT("NPCancelConnection: Name Length %d Entry Name Length %d\n"),
659  (wcslen(lpName) + 1) * sizeof(WCHAR), pNetResource->LocalNameLength));
660 #endif
661 
662  }
663  }
664 
666  &hMemory,
667  (PVOID)&pSharedMemory);
668  }
669 
670  return Status;
671 }
672 
675  __in LPWSTR lpLocalName,
676  __out_bcount(*lpBufferSize) LPWSTR lpRemoteName,
677  __inout LPDWORD lpBufferSize )
678 {
679  DWORD Status = 0;
680 
682  PNFS41NP_SHARED_MEMORY pSharedMemory;
683 
685  &hMemory,
686  (PVOID)&pSharedMemory);
687 
688  if (Status == WN_SUCCESS)
689  {
690  INT Index;
691  PNFS41NP_NETRESOURCE pNetResource;
693 
694  for (Index = 0; Index < pSharedMemory->NextAvailableIndex; Index++)
695  {
696  pNetResource = &pSharedMemory->NetResources[Index];
697 
698  if (pNetResource->InUse)
699  {
700  if ( ( (wcslen(lpLocalName) + 1) * sizeof(WCHAR) ==
701  pNetResource->LocalNameLength)
702  && ( !wcscmp(lpLocalName, pNetResource->LocalName) ))
703  {
704  if (*lpBufferSize < pNetResource->RemoteNameLength)
705  {
706  *lpBufferSize = pNetResource->RemoteNameLength;
708  }
709  else
710  {
711  *lpBufferSize = pNetResource->RemoteNameLength;
712  CopyMemory( lpRemoteName,
713  pNetResource->RemoteName,
714  pNetResource->RemoteNameLength);
715  Status = WN_SUCCESS;
716  }
717  break;
718  }
719  }
720  }
721 
722  CloseSharedMemory( &hMutex, &hMemory, (PVOID)&pSharedMemory);
723  }
724 
725  return Status;
726 }
727 
730  DWORD dwScope,
731  DWORD dwType,
732  DWORD dwUsage,
733  LPNETRESOURCE lpNetResource,
734  LPHANDLE lphEnum )
735 {
736  DWORD Status;
737 
738  DbgP((L"[aglo] NPOpenEnum\n"));
739 
740  *lphEnum = NULL;
741 
742  switch ( dwScope )
743  {
744  case RESOURCE_CONNECTED:
745  {
746  *lphEnum = HeapAlloc( GetProcessHeap( ), HEAP_ZERO_MEMORY, sizeof( ULONG ) );
747 
748  if (*lphEnum )
749  {
750  Status = WN_SUCCESS;
751  }
752  else
753  {
755  }
756  break;
757  }
758  break;
759 
760  case RESOURCE_CONTEXT:
761  default:
763  break;
764  }
765 
766 
767  DbgP((L"[aglo] NPOpenEnum returning Status %lx\n",Status));
768 
769  return(Status);
770 }
771 
774  HANDLE hEnum,
775  LPDWORD lpcCount,
777  LPDWORD lpBufferSize)
778 {
780  ULONG EntriesCopied;
781  LPNETRESOURCE pNetResource;
782  ULONG SpaceNeeded = 0;
783  ULONG SpaceAvailable;
784  PWCHAR StringZone;
786  PNFS41NP_SHARED_MEMORY pSharedMemory;
787  PNFS41NP_NETRESOURCE pNfsNetResource;
788  INT Index = *(PULONG)hEnum;
789 
790 
791  DbgP((L"[aglo] NPEnumResource\n"));
792 
793  DbgP((L"[aglo] NPEnumResource Count Requested %d\n", *lpcCount));
794 
795  pNetResource = (LPNETRESOURCE) lpBuffer;
796  SpaceAvailable = *lpBufferSize;
797  EntriesCopied = 0;
798  StringZone = (PWCHAR) ((PBYTE)lpBuffer + *lpBufferSize);
799 
801  &hMemory,
802  (PVOID)&pSharedMemory);
803 
804  if ( Status == WN_SUCCESS)
805  {
807  for (Index = *(PULONG)hEnum; EntriesCopied < *lpcCount &&
808  Index < pSharedMemory->NextAvailableIndex; Index++)
809  {
810  pNfsNetResource = &pSharedMemory->NetResources[Index];
811 
812  if (pNfsNetResource->InUse)
813  {
814  SpaceNeeded = sizeof( NETRESOURCE );
815  SpaceNeeded += pNfsNetResource->LocalNameLength;
816  SpaceNeeded += pNfsNetResource->RemoteNameLength;
817  SpaceNeeded += 5 * sizeof(WCHAR); // comment
818  SpaceNeeded += sizeof(NFS41_PROVIDER_NAME_U); // provider name
819  if ( SpaceNeeded > SpaceAvailable )
820  {
822  DbgP((L"[aglo] NPEnumResource More Data Needed - %d\n", SpaceNeeded));
823  *lpBufferSize = SpaceNeeded;
824  break;
825  }
826  else
827  {
828  SpaceAvailable -= SpaceNeeded;
829 
830  pNetResource->dwScope = pNfsNetResource->dwScope;
831  pNetResource->dwType = pNfsNetResource->dwType;
832  pNetResource->dwDisplayType = pNfsNetResource->dwDisplayType;
833  pNetResource->dwUsage = pNfsNetResource->dwUsage;
834 
835  // setup string area at opposite end of buffer
836  SpaceNeeded -= sizeof( NETRESOURCE );
837  StringZone = (PWCHAR)( (PBYTE) StringZone - SpaceNeeded );
838  // copy local name
839  StringCchCopy( StringZone,
840  pNfsNetResource->LocalNameLength,
841  pNfsNetResource->LocalName );
842  pNetResource->lpLocalName = StringZone;
843  StringZone += pNfsNetResource->LocalNameLength/sizeof(WCHAR);
844  // copy remote name
845  StringCchCopy( StringZone,
846  pNfsNetResource->RemoteNameLength,
847  pNfsNetResource->RemoteName );
848  pNetResource->lpRemoteName = StringZone;
849  StringZone += pNfsNetResource->RemoteNameLength/sizeof(WCHAR);
850  // copy comment
851  pNetResource->lpComment = StringZone;
852  *StringZone++ = L'A';
853  *StringZone++ = L'_';
854  *StringZone++ = L'O';
855  *StringZone++ = L'K';
856  *StringZone++ = L'\0';
857  // copy provider name
858  pNetResource->lpProvider = StringZone;
860  StringZone += sizeof(NFS41_PROVIDER_NAME_U)/sizeof(WCHAR);
861  EntriesCopied++;
862  // set new bottom of string zone
863  StringZone = (PWCHAR)( (PBYTE) StringZone - SpaceNeeded );
864  Status = WN_SUCCESS;
865  }
866  pNetResource++;
867  }
868  }
869  CloseSharedMemory( &hMutex, &hMemory, (PVOID*)&pSharedMemory);
870  }
871 
872  *lpcCount = EntriesCopied;
873  *(PULONG) hEnum = Index;
874 
875  DbgP((L"[aglo] NPEnumResource entries returned: %d\n", EntriesCopied));
876 
877  return Status;
878 }
879 
882  HANDLE hEnum )
883 {
884  DbgP((L"[aglo] NPCloseEnum\n"));
885  HeapFree( GetProcessHeap( ), 0, (PVOID) hEnum );
886  return WN_SUCCESS;
887 }
888 
891  LPNETRESOURCE lpNetResource,
893  LPDWORD lpBufferSize )
894 {
895  DbgP(( L"[aglo] NPGetResourceParent: WN_NOT_SUPPORTED\n" ));
896  return WN_NOT_SUPPORTED;
897 }
898 
901  __in LPNETRESOURCE lpNetResource,
902  __out_bcount(*lpBufferSize) LPVOID lpBuffer,
903  __inout LPDWORD lpBufferSize,
904  __deref_out LPWSTR *lplpSystem )
905 {
906  DbgP(( L"[aglo] NPGetResourceInformation: WN_NOT_SUPPORTED\n" ));
907  return WN_NOT_SUPPORTED;
908 }
909 
912  LPCWSTR lpLocalPath,
915  LPDWORD lpBufferSize )
916 {
917  DbgP(( L"[aglo] NPGetUniversalName: WN_NOT_SUPPORTED\n" ));
918  return WN_NOT_SUPPORTED;
919 }
#define QueryDosDevice
Definition: winbase.h:3748
DWORD APIENTRY NPGetResourceInformation(__in LPNETRESOURCE lpNetResource, __out_bcount(*lpBufferSize) LPVOID lpBuffer, __inout LPDWORD lpBufferSize, __deref_out LPWSTR *lplpSystem)
Definition: nfs41_np.c:900
#define NFS41NP_MUTEX_NAME
Definition: nfs41_np.h:25
#define WNNC_CON_ADDCONNECTION3
Definition: npapi.h:36
#define WN_BAD_NETNAME
Definition: winnetwk.h:135
void FreeConnectionInfo(IN PCONNECTION_INFO Connection)
Definition: options.c:92
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define DefineDosDevice
Definition: winbase.h:3619
#define IN
Definition: typedefs.h:39
#define WN_NO_MORE_DEVICES
Definition: winnetwk.h:131
ULONG SendTo_NFS41Driver(IN ULONG IoctlCode, IN PVOID InputDataBuf, IN ULONG InputDataLen, IN PVOID OutputDataBuf, IN PULONG pOutputDataLen)
Definition: nfs41_np.c:268
DWORD dwType
Definition: winnetwk.h:168
#define CloseHandle
Definition: compat.h:598
#define RESOURCEUSAGE_CONNECTABLE
Definition: winnetwk.h:68
_Inout_ PUSB_DEVICE_HANDLE DeviceHandle
Definition: hubbusif.h:121
#define WNNC_SPEC_VERSION
Definition: npapi.h:22
#define ERROR_SUCCESS
Definition: deptool.c:10
#define MapViewOfFile
Definition: compat.h:604
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
WCHAR ConnectionName[MAX_PATH]
Definition: nfs41_np.h:40
#define WN_SUCCESS
Definition: winnetwk.h:111
#define __out_bcount(x)
Definition: dbghelp.h:68
#define __in_opt
Definition: dbghelp.h:38
#define TRUE
Definition: types.h:120
#define WNNC_ENUMERATION
Definition: npapi.h:51
#define DDD_REMOVE_DEFINITION
Definition: winbase.h:521
uint16_t * PWSTR
Definition: typedefs.h:56
USHORT RemoteNameLength
Definition: nfs41_np.h:32
#define WNNC_CON_ADDCONNECTION
Definition: npapi.h:33
#define DDD_NO_BROADCAST_SYSTEM
Definition: winbase.h:523
void MarshalConnectionInfo(IN OUT PCONNECTION_INFO Connection)
Definition: options.c:68
_In_ LPCSTR lpName
Definition: winbase.h:2768
DWORD APIENTRY NPPasswordChangeNotify(__in LPCWSTR lpAuthentInfoType, __in LPVOID lpAuthentInfo, __in LPCWSTR lpPreviousAuthentInfoType, __in LPVOID lpPreviousAuthentInfo, __in LPWSTR lpStationName, LPVOID StationHandle, DWORD dwChangeInfo)
Definition: nfs41_np.c:394
LPSTR lpLocalName
Definition: winnetwk.h:171
FxMemoryObject * pMemory
#define IOCTL_NFS41_DELCONN
Definition: nfs41_driver.h:47
#define INVALID_HANDLE_VALUE
Definition: compat.h:590
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
STRSAFEAPI StringCchVPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat, va_list argList)
Definition: strsafe.h:490
#define TRACE_TAG
Definition: nfs41_np.c:38
DWORD InitializeConnectionInfo(IN OUT PCONNECTION_INFO Connection, IN PMOUNT_OPTION_BUFFER Options, OUT LPWSTR *ConnectionName)
Definition: options.c:26
int filter(unsigned int code)
Definition: nfs41_np.c:61
#define WN_NOT_SUPPORTED
Definition: winnetwk.h:113
#define WN_NOT_CONNECTED
Definition: winnetwk.h:132
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_ ULONG IoctlCode
Definition: wdfiotarget.h:1039
uint16_t * PWCHAR
Definition: typedefs.h:56
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define OutputDebugString
Definition: winbase.h:3746
DWORD dwDisplayType
Definition: winnetwk.h:169
DWORD APIENTRY NPOpenEnum(DWORD dwScope, DWORD dwType, DWORD dwUsage, LPNETRESOURCE lpNetResource, LPHANDLE lphEnum)
Definition: nfs41_np.c:729
int32_t INT
Definition: typedefs.h:58
#define WNNC_NET_TYPE
Definition: npapi.h:24
CHAR * LPTSTR
Definition: xmlstorage.h:192
#define FILE_SHARE_READ
Definition: compat.h:136
_SEH2_TRY
Definition: create.c:4226
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
ULONG BufferSize
Definition: options.h:57
#define WN_ALREADY_CONNECTED
Definition: winnetwk.h:137
#define RESOURCE_CONNECTED
Definition: winnetwk.h:58
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GENERIC_WRITE
Definition: nt_native.h:90
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define __out
Definition: dbghelp.h:62
DWORD APIENTRY NPCancelConnection(__in LPWSTR lpName, __in BOOL fForce)
Definition: nfs41_np.c:580
unsigned char BOOLEAN
#define DbgP(_x_)
Definition: nfs41_np.c:36
#define WNNC_USER
Definition: npapi.h:29
PCONNECTION_BUFFER Buffer
Definition: options.h:58
int marker
Definition: jpeglib.h:1030
DWORD APIENTRY NPEnumResource(HANDLE hEnum, LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
Definition: nfs41_np.c:773
char * va_list
Definition: acmsvcex.h:78
#define NFS41_USER_DEVICE_NAME
Definition: nfs41_driver.h:27
HANDLE hMutex
Definition: mutex.c:11
NETRESOURCEA * LPNETRESOURCE
Definition: winnetwk.h:593
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define OPEN_EXISTING
Definition: compat.h:634
LPSTR lpProvider
Definition: winnetwk.h:174
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
DWORD dwScope
Definition: winnetwk.h:167
Status
Definition: gdiplustypes.h:24
static DWORD StoreConnectionInfo(IN LPCWSTR LocalName, IN LPCWSTR ConnectionName, IN USHORT ConnectionNameLength, IN LPNETRESOURCE lpNetResource)
Definition: nfs41_np.c:187
char TCHAR
Definition: xmlstorage.h:189
int toupper(int c)
Definition: utclib.c:881
#define GetProcessHeap()
Definition: compat.h:595
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define CreateMutex
Definition: winbase.h:3612
__wchar_t WCHAR
Definition: xmlstorage.h:180
_In_ WDFCOLLECTION _In_ ULONG Index
#define NFS41_DEVICE_NAME
Definition: nfs41_driver.h:25
#define FILE_MAP_WRITE
Definition: winbase.h:154
#define MAX_PATH
Definition: compat.h:34
#define CopyMemory
Definition: winbase.h:1662
static FILE * out
Definition: regtests2xml.c:44
#define WNNC_DIALOG
Definition: npapi.h:38
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WNNC_ENUM_LOCAL
Definition: npapi.h:53
va_start(ap, x)
#define RESOURCE_CONTEXT
Definition: winnetwk.h:62
#define WNNC_CONNECTION
Definition: npapi.h:32
#define SetLastError(x)
Definition: compat.h:611
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:618
LPSTR lpComment
Definition: winnetwk.h:173
#define WNNC_NET_RDR2SAMPLE
Definition: winnetwk.h:47
DWORD dwUsage
Definition: winnetwk.h:170
DWORD APIENTRY NPGetResourceParent(LPNETRESOURCE lpNetResource, LPVOID lpBuffer, LPDWORD lpBufferSize)
Definition: nfs41_np.c:890
static const WCHAR L[]
Definition: oid.c:1250
DWORD APIENTRY NPGetUniversalName(LPCWSTR lpLocalPath, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpBufferSize)
Definition: nfs41_np.c:911
#define StringCchCopy
Definition: strsafe.h:139
DWORD APIENTRY NPGetConnection(__in LPWSTR lpLocalName, __out_bcount(*lpBufferSize) LPWSTR lpRemoteName, __inout LPDWORD lpBufferSize)
Definition: nfs41_np.c:674
VOID CloseSharedMemory(PHANDLE hMutex, PHANDLE hMemory, PVOID *pMemory)
Definition: nfs41_np.c:143
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:454
#define WNNC_START
Definition: npapi.h:56
#define __inout
Definition: dbghelp.h:50
#define GENERIC_READ
Definition: compat.h:135
Definition: inflate.c:139
_In_ DWORD dwInfoLevel
Definition: winsvc.h:422
#define IOCTL_NFS41_ADDCONN
Definition: nfs41_driver.h:46
WDFMEMORY hMemory
#define WNNC_ADMIN
Definition: npapi.h:47
#define NFS41_USER_SHARED_MEMORY_NAME
Definition: nfs41_driver.h:37
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
ULONG _cdecl NFS41DbgPrint(__in LPTSTR Format,...)
Definition: nfs41_np.c:42
#define WNNC_CON_CANCELCONNECTION
Definition: npapi.h:34
#define lstrlen
Definition: winbase.h:3732
_SEH2_END
Definition: create.c:4400
#define TEXT(s)
Definition: k32.h:26
DWORD dwStatus
Definition: mediaobj.idl:95
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: deviceio.c:136
#define DDD_RAW_TARGET_PATH
Definition: winbase.h:520
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define EXCEPTION_CONTINUE_SEARCH
Definition: excpt.h:86
IN OUT PVCB OUT PDIRENT OUT PBCB IN BOOLEAN CreateFile
Definition: fatprocs.h:913
unsigned short USHORT
Definition: pedump.c:61
#define WNNC_DRIVER_VERSION
Definition: npapi.h:27
DWORD APIENTRY NPAddConnection3(__in HWND hwndOwner, __in LPNETRESOURCE lpNetResource, __in_opt LPWSTR lpPassword, __in_opt LPWSTR lpUserName, __in DWORD dwFlags)
Definition: nfs41_np.c:428
DWORD OpenSharedMemory(PHANDLE phMutex, PHANDLE phMemory, PVOID *pMemory)
Definition: nfs41_np.c:68
unsigned int * PULONG
Definition: retypes.h:1
#define NULL
Definition: types.h:112
USHORT ConnectionNameLength
Definition: nfs41_np.h:33
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define WN_NO_MORE_ENTRIES
Definition: winnetwk.h:146
LPSTR lpRemoteName
Definition: winnetwk.h:172
#define NFS41_PROVIDER_NAME_U
Definition: nfs41_driver.h:30
NETRESOURCEA NETRESOURCE
Definition: winnetwk.h:593
#define WN_OUT_OF_MEMORY
Definition: winnetwk.h:125
#define WNNC_DRIVER(major, minor)
Definition: nfs41_np.c:39
#define __deref_out
Definition: dbghelp.h:26
#define WN_MORE_DATA
Definition: winnetwk.h:117
uint32_t * LPDWORD
Definition: typedefs.h:59
unsigned int ULONG
Definition: retypes.h:1
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:40
#define OpenFileMapping
Definition: winbase.h:3743
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184
DWORD APIENTRY NPAddConnection(__in LPNETRESOURCE lpNetResource, __in_opt LPWSTR lpPassword, __in_opt LPWSTR lpUserName)
Definition: nfs41_np.c:419
WCHAR RemoteName[MAX_PATH]
Definition: nfs41_np.h:39
#define INFINITE
Definition: serial.h:102
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
#define UnmapViewOfFile
Definition: compat.h:605
DWORD APIENTRY NPLogonNotify(__in PLUID lpLogonId, __in PCWSTR lpAuthentInfoType, __in PVOID lpAuthentInfo, __in PCWSTR lpPreviousAuthentInfoType, __in PVOID lpPreviousAuthentInfo, __in PWSTR lpStationName, __in PVOID StationHandle, __out PWSTR *lpLogonScript)
Definition: nfs41_np.c:378
#define __in
Definition: dbghelp.h:35
#define NFS41NP_MAX_DEVICES
Definition: nfs41_np.h:27
static SERVICE_STATUS status
Definition: service.c:31
DWORD APIENTRY NPCloseEnum(HANDLE hEnum)
Definition: nfs41_np.c:881
USHORT LocalNameLength
Definition: nfs41_np.h:31
BYTE * PBYTE
Definition: pedump.c:66
#define WNNC_SPEC_VERSION51
Definition: npapi.h:23
#define HeapFree(x, y, z)
Definition: compat.h:594
USHORT NameLength
Definition: options.h:45
#define APIENTRY
Definition: api.h:79
#define DDD_EXACT_MATCH_ON_REMOVE
Definition: winbase.h:522
#define WN_BAD_LOCALNAME
Definition: winnetwk.h:136
DWORD APIENTRY NPGetCaps(DWORD nIndex)
Definition: nfs41_np.c:329
#define WNNC_CON_GETCONNECTIONS
Definition: npapi.h:35
WCHAR LocalName[MAX_PATH]
Definition: nfs41_np.h:38
Definition: ps.c:97