#include <9pm/windows.h>
#include <9pm/u.h>
#include <9pm/libc.h>

DWORD WINAPI
WNetEnumResource(HANDLE  hEnum, LPDWORD lpcCount, LPVOID lpBuffer,
	LPDWORD lpBufferSize)
{
	uchar *buf;
	Rune *p;
	NETRESOURCEW *rw;
	NETRESOURCEA *ra;
	int n, n2, r, i;

	if(win_useunicode)
		return WNetEnumResourceW(hEnum, lpcCount, lpBuffer,
			lpBufferSize);

	n = *lpBufferSize;
	n /= 2;		/* be conservative */
	buf = win_malloc(n);
	r = WNetEnumResourceA(hEnum, lpcCount, buf, &n2);
	if(r != NO_ERROR) {
		*lpBufferSize = n2*2;
		win_free(buf);
		return r;
	}
	n = *lpcCount;
	ra = (NETRESOURCEA*)buf;
	rw = (NETRESOURCEW*)lpBuffer;
	p = (Rune*)(rw+n);
	for(i=0; i<n; i++,ra++,rw++) {
		memset(rw, 0, sizeof(NETRESOURCEW));
		rw->dwScope = ra->dwScope;
		rw->dwType = ra->dwType;
		rw->dwDisplayType = ra->dwDisplayType;
		rw->dwUsage = ra->dwUsage;
		if(ra->lpLocalName) {
			rw->lpLocalName = p;
			p += win_utf2wstrn(p, MAX_PATH, ra->lpLocalName) + 1;
		}
		if(ra->lpRemoteName) {
			rw->lpRemoteName = p;
			p += win_utf2wstrn(p, MAX_PATH, ra->lpRemoteName) + 1;
		}
		if(ra->lpComment) {
			rw->lpComment = p;
			p += win_utf2wstrn(p, MAX_PATH, ra->lpComment) + 1;
		}
		if(ra->lpProvider) {
			rw->lpProvider = p;
			p += win_utf2wstrn(p, MAX_PATH, ra->lpProvider) + 1;
		}
	}

	assert((uchar*)p-(uchar*)lpBuffer < (int)*lpBufferSize);
	*lpBufferSize = (uchar*)p-(uchar*)lpBuffer;
	
	win_free(buf);
	return NO_ERROR;
}




syntax highlighted by Code2HTML, v. 0.9.1