Witam.

Code::Blocks / C++ / Windows XP

Usiłuje napisać aplikację, która będzie pozwalała mi na zapis danych do pliku WIM.

W tym celu korzystam z biblioteki wimgapi.dll.

Aby móc zapisać informację do tego pliku, używam trzech funkcji z tej biblioteki :

     WIMCreateFile
     http://msdn.microsoft.com/en-us/library/dd851934.aspx

     WIMSetImageInformation
     http://msdn.microsoft.com/en-us/library/dd834951.aspx

     WIMCloseHandle
     http://msdn.microsoft.com/en-us/library/dd851955.aspx

Kod odpowiedzialny, za "ładowanie" biblioteki oraz pobieranie adresów funkcji :

     typedef HANDLE (*DLLCreateFile)(PWSTR, DWORD, DWORD, DWORD, DWORD, PDWORD);
     typedef BOOL   (*DLLCloseHandle)(HANDLE);
     typedef BOOL   (*DLLSetInformation)(HANDLE, PVOID, DWORD);

     DLLCreateFile     _DLLCreateFile;
     DLLCloseHandle    _DLLCloseHandle;
     DLLSetInformation _DLLSetInformation;

     HINSTANCE hInstLibrary = LoadLibrary("E:\\WIMAPI\\wimgapi.dll");
     
     cout << GetLastError() << endl;

     if (hInstLibrary)
     {
          _DLLCreateFile      = (DLLCreateFile)GetProcAddress(hInstLibrary    , "WIMCreateFile");
          _DLLCloseHandle     = (DLLCloseHandle)GetProcAddress(hInstLibrary   , "WIMCloseHandle");
          _DLLSetInformation  = (DLLSetInformation)GetProcAddress(hInstLibrary, "WIMSetImageInformation");

          if(_DLLCreateFile != NULL)
          {
               WMI_FILE_HANDLE = _DLLCreateFile(L"E:\\WIMAPI\\plik.wim", 0x40000000, 0x00000004, 0x00000002, 0x00000000, &IS_FILE_CREATED);

               cout << GetLastError() << endl;

               // xml_data - zmienna typu char, która przechowuje dane w formacie XML o obrazie

               if(_DLLSetInformation != NULL)
               {
                    SET_RET = _DLLSetInformation(WMI_FILE_HANDLE, (LPVOID)xml_data, sizeof(xml_data));

                    cout << GetLastError() << endl;
               }

               if(_DLLCloseHandle != NULL && _DLLCloseHandle(WMI_FILE_HANDLE) == TRUE)
                    cout << "Handle closed" << endl;

               cout << GetLastError() << endl;
          }

           FreeLibrary(hInstLibrary);
           cout << GetLastError() << endl;
}

Nie ma problemu z ustaleniem samych adresów funkcji, ta część kodu działa.

Po każdym wywołaniu funkcji z biblioteki DLL sprawdzam wartość zwracaną funkcji GetLastError i za każdym razem jest to 0 - czyli wszystko w porządku.

Funckja _DLLCreateFile zwraca wartość różną od NULL, czyli teoretycznie uchwyt do pliku

Wydaje mi się, iż otwarcie pliku do zapisu działa poprawnie, ponieważ po zakończeniu pracy programu zmienia się data modyfikacji pliku - sugeruje to poprawność działania funkcji _DLLCreateFile, ale mogę się mylić.

Funkcja _DLLSetInformation zwraca wartość TRUE - czyli twierdzi, że dane zostały zapisane do pliku WIM.

MSDN mówi, że dane zapisywane do pliku WIM powinny być ujęte w sposób następujący :

     <WIM>
          // informacje do zapisu
     </WIM>

EDIT :

Doczytałem również, iż dane które chce zapisać do pliku wim (XML) muszą być w formacie UNICODE.

Użyłem więc zmiennej typu wchar_t, w niej zapisałem dane, ale skutek jest ten sam.

Kolejna rzecz do której udało mi się dojść, to informacja o tym, że pierwszy bajt danych XML powinien mieć wartość : 0xFEFF

Wartość tą ustawiam na początku danych XML. Niestety kolejna teoria spaliła na panewce.

###################################################################################

Używam również metody WIMRegisterLogFile z biblioteki wingapi.dll w celu tworzenia log-a z aktualnej sesji.

Plik jest czysty, nie zawiera żadnych błędów.

Funkcja działa poprawnie, ponieważ dla testu celowo wywołałem metodę WIMCreateFile z błędnymi parametrami i informacje o błędach pojawiły się w logu.

###################################################################################

Mogę również w 100% potwierdzić, że uchwyt do pliku jest pobierany prawidłowo.

Użyłem struktury WIM_INFO oraz metody WIMGetAttributes, w której jednym ze składników jest zmienna określająca ścieżkę do pliku WIM

WIM_INFO.WimPath

Zmienna wskazuje na plik do którego podałem ścieżkę w kodzie.


Tak też właśnie robię.

Problem niestety leży w tym, iż faktycznie dane te nie są zapisywane do pliku.

Będę wdzięczny za wszelkie sugestie.

Z góry dzięki za info.

Pozdrawiam.