// @pymethod ([dict, ...], total, resumeHandle)|win32net|NetUseEnum|Retrieves information about transport protocols that are currently managed by the redirector // @rdesc The result is a list of items read (with each item being a dictionary of format // <o PyUSE_INFO_*>, depending on the level parameter), // the total available, and a new "resume handle". The first time you call // this function, you should pass zero for the resume handle. If more data // is available than what was returned, a new non-zero resume handle will be // returned, which can be used to call the function again to fetch more data. // This process may repeat, each time with a new resume handle, until zero is // returned for the new handle, indicating all the data has been read. PyObject * PyNetUseEnum(PyObject *self, PyObject *args) { WCHAR *szServer = NULL, *szDomain = NULL; PyObject *obServer, *obDomain = Py_None; PyObject *ret = NULL; PyNET_STRUCT *pInfo; DWORD err; DWORD dwPrefLen = MAX_PREFERRED_LENGTH; DWORD level; BOOL ok = FALSE; DWORD resumeHandle = 0; DWORD numRead, i; PyObject *list; BYTE *buf = NULL; DWORD totalEntries = 0; // @pyparm string/<o PyUnicode>|server||The name of the server to execute on, or None. // @pyparm int|level||The level of data required. Currently levels 0, 1 and // 2 are supported. // @pyparm int|resumeHandle|0|A resume handle. See the return description for more information. // @pyparm int|prefLen|MAX_PREFERRED_LENGTH|The preferred length of the data buffer. if (!PyArg_ParseTuple(args, "Oi|ii", &obServer, &level, &resumeHandle, &dwPrefLen)) return NULL; if (!PyWinObject_AsWCHAR(obServer, &szServer, TRUE)) goto done; if (!PyWinObject_AsWCHAR(obDomain, &szDomain, TRUE)) goto done; if (!FindNET_STRUCT(level, use_infos, &pInfo)) goto done; err = NetUseEnum(szServer, level, &buf, dwPrefLen, &numRead, &totalEntries, &resumeHandle); if (err!=0 && err != ERROR_MORE_DATA) { ReturnNetError("NetUseEnum",err); goto done; } list = PyList_New(numRead); if (list==NULL) goto done; for (i=0;i<numRead;i++) { PyObject *sub = PyObject_FromNET_STRUCT(pInfo, buf+(i*pInfo->structsize)); if (sub==NULL) goto done; PyList_SetItem(list, i, sub); } resumeHandle = err==0 ? 0 : resumeHandle; ret = Py_BuildValue("Oll", list, totalEntries, resumeHandle); Py_DECREF(list); ok = TRUE; done: if (buf) NetApiBufferFree(buf); if (!ok) { Py_XDECREF(ret); ret = NULL; } PyWinObject_FreeWCHAR(szServer); return ret; // @pyseeapi NetUseEnum }
static BOOL net_use(int argc, const WCHAR* argv[]) { USE_INFO_2 *buffer, *connection; DWORD read, total, resume_handle, rc, i; WCHAR* status[STRING_RECONN-STRING_OK+1]; resume_handle = 0; buffer = NULL; if(argc<3) { HMODULE hmod = GetModuleHandleW(NULL); /* Load the status strings */ for (i = 0; i < sizeof(status)/sizeof(*status); i++) { status[i] = HeapAlloc(GetProcessHeap(), 0, 1024 * sizeof(**status)); LoadStringW(hmod, STRING_OK+i, status[i], 1024); } do { rc = NetUseEnum(NULL, 2, (BYTE **) &buffer, 2048, &read, &total, &resume_handle); if (rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS) { break; } if(total == 0) { output_string(STRING_NO_ENTRIES); break; } output_string(STRING_USE_HEADER); for (i = 0, connection = buffer; i < read; ++i, ++connection) output_string(STRING_USE_ENTRY, status[connection->ui2_status], connection->ui2_local, connection->ui2_remote, connection->ui2_refcount); if (buffer != NULL) NetApiBufferFree(buffer); } while (rc == ERROR_MORE_DATA); /* Release the status strings */ for (i = 0; i < sizeof(status)/sizeof(*status); i++) HeapFree(GetProcessHeap(), 0, status[i]); return TRUE; } return FALSE; }