4.1.10.5.1 TransformInput

 procedure TransformInput(
   hDrs: DRS_HANDLE,
   requestVersion: DWORD,
   requestUnion: DRS_MSG_GETCHGREQ,
   var nativeRequest: DRS_MSG_GETCHGREQ_V10,
   pdwOutVersion: ADDRESS OF DWORD,
   var responseSmtpAddress: unicodestring): ULONG

Informative summary of behavior: The TransformInput procedure transforms the received request message into a V10 request, which is a superset of the supported request messages.

 optionalFeatures: sequence of msDS-OptionalFeature objects /* [MS-ADSC] */
 extClient: DRS_EXTENSIONS_INT
 extServer: DRS_EXTENSIONS_INT
 optionalFeatureBit: integer
  
 extClient := ClientExtensions(hDrs)
 responseSmtpAddress := null
  
 if requestVersion < dc.minimumGetChangesRequestVersion 
     return ERROR_REVISION_MISMATCH
  
 if requestVersion = 10
   /* Windows Server 2008 R2 RPC request. */
   nativeRequest := requestUnion.V10
   if DRS_EXT_GETCHGREPLY_V9 in extClient.dwFlags then
     pdwOutVersion^ = 9
   else if DRS_EXT_GETCHGREPLY_V6 in extClient.dwFlags then
     pdwOutVersion^ = 6
   else
     return ERROR_REVISION_MISMATCH
   endif
  
 else if requestVersion = 8
   /* Windows Server 2003 RPC request. */
   nativeRequest := requestUnion.V8
   nativeRequest.ulMoreFlags := 0
   if not DRS_EXT_GETCHGREPLY_V6 in extClient.dwFlags then
     return ERROR_REVISION_MISMATCH
   else
     pdwOutVersion^ := 6
   endif
  
 else if requestVersion = 7 then
   /* Windows Server 2003 SMTP request. */
   responseSmtpAddress := requestUnion.V7.pmtxReturnAddress^.mtx_name
   nativeRequest := requestUnion.V7.V3
   nativeRequest.pUpToDateVecDest :=
       requestUnion.V7.V3.pUpToDateVecDestV1
   nativeRequest.pPartialAttrSet := requestUnion.V7.pPartialAttrSet
   nativeRequest.pPartialAttrSetEx :=
       requestUnion.V7.pPartialAttrSetEx
   nativeRequest.PrefixTableDest := requestUnion.V7.PrefixTableDest
   nativeRequest.ulMoreFlags := 0
   if not DRS_EXT_GETCHGREPLY_V6 in extClient.dwFlags then
     return ERROR_REVISION_MISMATCH
   else
     pdwOutVersion^ := 6
   endif
  
 else if requestVersion = 5 then
   /* Windows 2000 RPC request. */
   nativeRequest := requestUnion.V5
   nativeRequest.pUpToDateVecDest := 
       requestUnion.V5.pUpToDateVecDestV1
   nativeRequest.pPartialAttrSetEx := null
   nativeRequest.PrefixTableDest :=
       ConcretePTFromAbstractPT(dc.prefixTable)
   nativeRequest.ulMoreFlags := 0
   if ({DRS_WRIT_REP} ∩ requestUnion.V5.ulFlags) = null then
     nativeRequest.pPartialAttrSet := GCPAS()
   endif
   pdwOutVersion^ := 1
  
 else if requestVersion = 4 then
   /* Windows 2000 SMTP request. */
   responseSmtpAddress := requestUnion.V4.pmtxReturnAddress^.mtx_name
   nativeRequest := requestUnion.V4.V3
   nativeRequest.pUpToDateVecDest :=
       requestUnion.V4.V3.pUpToDateVecDestV1
   if ({DRS_WRIT_REP} ∩ requestUnion.V4.V3.ulFlags) = null then
     nativeRequest.pPartialAttrSet := GCPAS()
   endif
   nativeRequest.pPartialAttrSetEx := null
   nativeRequest.ulMoreFlags := 0
   pdwOutVersion^ := 1
 else
   /* Unsupported request. */
   return ERROR_REVISION_MISMATCH
 endif
  
 if ({DRS_WRIT_REP} ∩ nativeRequest.ulFlags) ≠ null then
   nativeRequest.ulFlags := 
       nativeRequest.ulFlags + {DRS_GET_ALL_GROUP_MEMBERSHIP}
 endif
  
 if (responseSmtpAddress = null) ≠ (not DRS_MAIL_REP in
     nativeRequest.ulFlags) then
   return ERROR_INVALID_PARAMETER
 endif
  
 extServer := ServerExtensions(hDrs)
 optionalFeatures := list of msDS-OptionalFeature objects from the
                     Optional Features container /* [MS-ADTS] section 6.1.1.2.4.1.3 */
  
 foreach feature in optionalFeatures
     if (GetOptionalFeatureBit(feature!msDS-OptionalFeatureGUID, optionalFeatureBit))
         if (optionalFeatureBit in extServer.dwFlagsEx) and
           optionalFeatureBit not in extClient.dwExtCaps then
             /* Feature is enabled on the server but the client
                is not capable of supporting it */
             return ERROR_REVISION_MISMATCH
         endif
     endif
     /* NOTE: The behavior of the server is undefined if */
     /* procedure GetOptionalFeatureBit() returns false. */
 endfor
 return 0