text: 
  #include "stdafx.h"
  #include "qrythrd.h"
  
  
  HRESULT 
  IssueQuery(LPTHREADDATA ptd)
  {
      HRESULT hres;
      DWORD dwres;
      LPTHREADINITDATA ptid = ptd->ptid;
      LPWSTR pQuery = NULL;
      INT cItems, iColumn;
      INT cMaxResult = MAX_RESULT;
      BOOL fStopQuery = FALSE;
      IDirectorySearch* pDsSearch = NULL;
      LPWSTR pszTempPath = NULL;
      IDsDisplaySpecifier *pdds = NULL;
      ADS_SEARCH_HANDLE hSearch = NULL;
      ADS_SEARCHPREF_INFO prefInfo[3];
      ADS_SEARCH_COLUMN column;
      HDPA hdpaResults = NULL;
      LPQUERYRESULT pResult = NULL;
      WCHAR szBuffer[2048];               // MAX_URL_LENGHT
      INT resid;
      LPWSTR pColumnData = NULL;
      HKEY hkPolicy = NULL;
      USES_CONVERSION;
  
      TraceEnter(TRACE_QUERYTHREAD, "QueryThread_IssueQuery");    
  
      // The foreground gave us a query so we are going to go and issue
      // it now, having done this we will then be able to stream the 
      // result blobs back to the caller. 
  
      hres = QueryThread_GetFilter(&pQuery, ptid->pQuery, ptid->fShowHidden);
      FailGracefully(hres, "Failed to build LDAP query from scope, parameters + filter");
  
      Trace(TEXT("Query is: %s"), W2T(pQuery));
      Trace(TEXT("Scope is: %s"), W2T(ptid->pScope));
      
      // Get the IDsDisplaySpecifier interface:
  
      hres = CoCreateInstance(CLSID_DsDisplaySpecifier, NULL, CLSCTX_INPROC_SERVER, IID_IDsDisplaySpecifier, (void **)&pdds);
      FailGracefully(hres, "Failed to get the IDsDisplaySpecifier object");
  
      hres = pdds->SetServer(ptid->pServer, ptid->pUserName, ptid->pPassword, DSSSF_DSAVAILABLE);
      FailGracefully(hres, "Failed to server information");
  
      // initialize the query engine, specifying the scope, and the search parameters
  
      hres = QueryThread_BuildPropertyList(ptd);
      FailGracefully(hres, "Failed to build property array to query for");
  
      hres = ADsOpenObject(ptid->pScope, ptid->pUserName, ptid->pPassword, ADS_SECURE_AUTHENTICATION,
                              IID_IDirectorySearch, (LPVOID*)&pDsSearch);
  
      FailGracefully(hres, "Failed to get the IDirectorySearch interface for the given scope");
  
      prefInfo[0].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;     // sub-tree search
      prefInfo[0].vValue.dwType = ADSTYPE_INTEGER;
      prefInfo[0].vValue.Integer = ADS_SCOPE_SUBTREE;
  
      prefInfo[1].dwSearchPref = ADS_SEARCHPREF_ASYNCHRONOUS;     // async
      prefInfo[1].vValue.dwType = ADSTYPE_BOOLEAN;
      prefInfo[1].vValue.Boolean = TRUE;
  
      prefInfo[2].dwSearchPref = ADS_SEARCHPREF_PAGESIZE;         // paged results
      prefInfo[2].vValue.dwType = ADSTYPE_INTEGER;
      prefInfo[2].vValue.Integer = PAGE_SIZE;
  
      hres = pDsSearch->SetSearchPreference(prefInfo, ARRAYSIZE(prefInfo));
      FailGracefully(hres, "Failed to set search preferences");
  
      hres = pDsSearch->ExecuteSearch(pQuery, ptd->aProperties, ptd->cProperties, &hSearch);
      FailGracefully(hres, "Failed in ExecuteSearch");
  
      // pick up the policy value which defines the max results we are going to use
  
      dwres = RegOpenKey(HKEY_CURRENT_USER, DS_POLICY, &hkPolicy);
      if ( ERROR_SUCCESS == dwres )
      {
          DWORD dwType, cbSize;
  
          dwres = RegQueryValueEx(hkPolicy, TEXT("QueryLimit"), NULL, &dwType, NULL, &cbSize);
          if ( (ERROR_SUCCESS == dwres) && (dwType == REG_DWORD) && (cbSize == SIZEOF(cMaxResult)) )
          {
              RegQueryValueEx(hkPolicy, TEXT("QueryLimit"), NULL, NULL, (LPBYTE)&cMaxResult, &cbSize);
          }
  
          RegCloseKey(hkPolicy);
      }
      
  
  