Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
4.9 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1992.
  5. //
  6. // File: msf.cxx
  7. //
  8. // Contents: Entry points for MSF DLL
  9. //
  10. // Classes: None.
  11. //
  12. // Functions: DllMuliStreamFromStream
  13. // DllConvertStreamToMultiStream
  14. // DllReleaseMultiStream
  15. // DllGetScratchMultiStream
  16. // DllIsMultiStream
  17. //
  18. //--------------------------------------------------------------------------
  19. #include "msfhead.cxx"
  20. #include "h/handle.hxx"
  21. //+-------------------------------------------------------------------------
  22. //
  23. // Function: DllMultiStreamFromStrea
  24. //
  25. // Synopsis: Create a new multistream instance from an existing stream.
  26. // This is used to reopen a stored multi-stream.
  27. //
  28. // Effects: Creates a new CMStream instance
  29. //
  30. // Arguments: [ppms] -- Pointer to storage for return of multistream
  31. // [pplstStream] -- Stream to be used by multi-stream for
  32. // reads and writes
  33. // [dwFlags] - Startup flags
  34. //
  35. // Returns: STG_E_INVALIDHEADER if signature on pStream does not
  36. // match.
  37. // STG_E_UNKNOWN if there was a problem in setup.
  38. // S_OK if call completed OK.
  39. //
  40. // Algorithm: Check the signature on the pStream and on the contents
  41. // of the pStream. If either is a mismatch, return
  42. // STG_E_INVALIDHEADER.
  43. // Create a new CMStream instance and run the setup function.
  44. // If the setup function fails, return STG_E_UNKNOWN.
  45. // Otherwise, return S_OK.
  46. //
  47. // Notes:
  48. //
  49. //--------------------------------------------------------------------------
  50. SCODE DllMultiStreamFromStream(CMStream **ppms,
  51. ILockBytes **pplstStream,
  52. DWORD dwFlags)
  53. {
  54. SCODE sc;
  55. CMStream *temp;
  56. BOOL fConvert = ((dwFlags & RSF_CONVERT) != 0);
  57. BOOL fTruncate = ((dwFlags & RSF_TRUNCATE) != 0);
  58. BOOL fCreate = ((dwFlags & RSF_CREATE) != 0);
  59. msfDebugOut((DEB_ITRACE,"In DllMultiStreamFromStream\n"));
  60. temp = new CMStream(pplstStream, dwFlags & RSF_SECTORSIZE4K ?
  61. SECTORSHIFT4K : SECTORSHIFT512);
  62. msfMem(temp);
  63. STATSTG stat;
  64. (*pplstStream)->Stat(&stat, STATFLAG_NONAME);
  65. msfDebugOut((DEB_ITRACE,"Size is: %lu\n",stat.cbSize.QuadPart));
  66. do
  67. {
  68. if ((stat.cbSize.QuadPart != 0) && (fConvert))
  69. {
  70. msfChk(temp->InitConvert());
  71. break;
  72. }
  73. if ((stat.cbSize.QuadPart == 0 && fCreate) || (fTruncate))
  74. {
  75. msfChk(temp->InitNew());
  76. break;
  77. }
  78. msfChk(temp->Init());
  79. }
  80. while (FALSE);
  81. *ppms = temp;
  82. msfDebugOut((DEB_ITRACE,"Leaving DllMultiStreamFromStream\n"));
  83. if (fConvert && stat.cbSize.QuadPart != 0)
  84. {
  85. return STG_S_CONVERTED;
  86. }
  87. return S_OK;
  88. Err:
  89. delete temp;
  90. return sc;
  91. }
  92. //+-------------------------------------------------------------------------
  93. //
  94. // Function: DllReleaseMultiStream
  95. //
  96. // Synopsis: Release a CMStream instance
  97. //
  98. // Effects: Deletes a multi-stream instance
  99. //
  100. // Arguments: [pms] -- pointer to object to be deleted
  101. //
  102. // Returns: S_OK.
  103. //
  104. // Modifies: Deletes the object pointed to by pMultiStream
  105. //
  106. // Algorithm: Delete the passed in pointer.
  107. //
  108. // Notes:
  109. //
  110. //--------------------------------------------------------------------------
  111. void DllReleaseMultiStream(CMStream *pms)
  112. {
  113. msfDebugOut((DEB_TRACE,"In DllReleaseMultiStream(%p)\n",pms));
  114. delete pms;
  115. msfDebugOut((DEB_TRACE,"Out DllReleaseMultiStream()\n"));
  116. }
  117. //+-------------------------------------------------------------------------
  118. //
  119. // Function: DllIsMultiStream
  120. //
  121. // Synopsis: Check a given Lstream to determine if it is a valid
  122. // multistream.
  123. //
  124. // Arguments: [plst] -- Pointer to lstream to check
  125. //
  126. // Returns: S_OK if lstream is a valid multistream
  127. // STG_E_UNKNOWN otherwise
  128. //
  129. // Notes:
  130. //
  131. //--------------------------------------------------------------------------
  132. SCODE DllIsMultiStream(ILockBytes *plst)
  133. {
  134. SCODE sc;
  135. CMSFHeader *phdr;
  136. phdr = new CMSFHeader(SECTORSHIFT512);
  137. msfMem(phdr);
  138. ULONG ulTemp;
  139. ULARGE_INTEGER ulOffset;
  140. ULISet32(ulOffset, 0);
  141. msfHChk(plst->ReadAt(ulOffset, phdr, sizeof(CMSFHeader), &ulTemp));
  142. phdr->ByteSwap(); // swap to machine format if neccessary
  143. if (ulTemp != sizeof(CMSFHeader))
  144. {
  145. msfErr(Err, STG_E_UNKNOWN);
  146. }
  147. msfChk(phdr->Validate());
  148. Err:
  149. delete phdr;
  150. return sc;
  151. }
  152. #if DEVL == 1
  153. //The following is a private function so I can set the debug level easily.
  154. VOID SetInfoLevel(ULONG x)
  155. {
  156. msfInfoLevel=x;
  157. }
  158. #endif