Cara mencopot Media yang dapat dicabut pada Windows NT/Windows 2000/Windows XP

PENTING: Artikel ini diterjemahkan oleh perangkat lunak penerjemahan mesin Microsoft, dan mungkin telah diedit oleh Masyarakat Microsoft melalui teknologi CTF dan bukan oleh seorang penerjemah profesional. Microsoft menawarkan baik artikel yang diterjemahkan oleh manusia maupun artikel hasil editan terjemahan oleh mesin/komunitas, sehingga Anda dapat mengakses semua artikel di Sentra Pengetahuan yang kami miliki dalam berbagai bahasa. Namun artikel hasil editan mesin atau bahkan komunitas tidak selalu sempurna. Artikel ini dapat mengandung kesalahan dalam hal kosa kata, sintaksis atau tatabahasa, sangat mirip dengan penutur asing yang membuat kekeliruan ketika berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab atas ketidakakuratan, kesalahan atau kerugian apa pun akibat dari kekeliruan dalam penerjemahan isi atau penggunaannya oleh pelanggan kami. Microsoft juga akan senantiasa memperbarui perangkat lunak penerjemahan mesin dan alat untuk menyempurnakan Editan Hasil Penerjemahan Mesin.

Klik disini untuk melihat versi Inggris dari artikel ini: 165721
Ringkasan
Win32 aplikasi yang berjalan pada Windows NT secara sistematis dapat mengeluarkan mediafrom drive yang memiliki dukungan peranti penangkap keras untuk menghilangkan media. Namun, theymust melakukannya dengan benar untuk menghindari merusak media. Artikel ini explainshow mengeluarkan media dengan benar pada Windows NT.
Informasi lebih lanjut
Versi Windows NT 4.0 dan kemudian dukungan mendepak media diformat dengan sistem berkas NTFSand FAT tanpa mematikan komputer. Windows NT 3.51 andearlier dukungan ejecting FAT diformat media tanpa dimatikan. Namun, versi Windows NT 3.51 dan sebelumnya tidak mendukung menghapus mediaformatted dengan NTFS ketika sistem yang sedang berjalan. Pada versi 3.51 andearlier sistem harus dimatikan untuk menghindari merusak data di media.

Ketika volume yang terpasang pada Windows NT, ada dua kategori readand menulis operasi: 1) data operasi dilakukan oleh aplikasi, dan 2) terkait struktur file sistem operasi yang dilakukan oleh Windows NT. Thesecond kategori digunakan oleh Windows NT untuk mempertahankan sistem berkas itu sendiri, seperti entri direktori berkas (misalnya, berkas kali, ukuran, nama, dll).

Win32 aplikasi dapat menggunakan cache atau cache akses ke berkas. Windows NT, di sisi lain, tembolok beberapa operasi tulis file systemdata struktur untuk menerapkan skema "malas penulis". Hal ini memungkinkan Windows NTto menunda beberapa penulisan ke disk sampai mereka mutlak diperlukan. Dengan cara ini, hanya perubahan terbaru harus ditulis ke disk jika file sistem datais sering diperbarui.

Karena Windows NT menggunakan sistem malas penulis untuk memperbarui berkas sistem datastructures media, media akan rusak apabila media ejectedwhile sistem memperbarui informasi ini. Untuk menghindari masalah ini, Win32applications harus mengambil langkah-langkah berikut ini dengan benar mengeluarkan removablemedia dan mencegah kerusakan data yang mungkin:
  1. Panggilan CreateFile dengan GENERIC_READ| GENERIC_WRITE, FILE_SHARE_READ| FILE_SHARE_WRITE, dan OPEN_EXISTING. LpFileName parameter harus \\.\X: (di mana X adalah huruf kandar yang nyata). Semua parameter lainnya dapat nol.
  2. Mengunci volume dengan penerbit IOCTL FSCTL_LOCK_VOLUME melalui DeviceIoControl. Jika aplikasi lain atau sistem yang menggunakan volume, IOCTL ini gagal. Setelah fungsi ini gulung balik berhasil, aplikasi dijamin volume tidak digunakan oleh apa pun di sistem.
  3. Turun volume dengan penerbit FSCTL_DISMOUNT_VOLUME IOCTL. Hal ini menyebabkan sistem berkas untuk menghapus semua pengetahuan volume dan membuang informasi internal yang terus-menerus mengenai volume.
  4. Pastikan media dapat dihapus oleh penerbit IOCTL_STORAGE_MEDIA_REMOVAL IOCTL. Menetapkan anggota PreventMediaRemoval struktur PREVENT_MEDIA_REMOVAL menjadi FALSE sebelum memanggil IOCTL ini. Hal ini akan menghentikan peranti penangkap dari mencegah penghapusan media.
  5. Keluarkan media dengan IOCTL_STORAGE_EJECT_MEDIA IOCTL. Jika peranti penangkap tidak mengizinkan ejeksi otomatis, kemudian IOCTL_STORAGE_EJECT_MEDIA dapat diabaikan dan pengguna dapat diperintahkan untuk menghapus media.
  6. Tutup menangani volume yang diperoleh di langkah pertama atau masalah FSCTL_UNLOCK_VOLUME IOCTL. Hal ini memungkinkan pengandar yang digunakan oleh proses lainnya.
Kode berikut menunjukkan cara melakukan ejeksi aman menggunakan thesteps yang dijelaskan di atas:
   #include <windows.h>   #include <winioctl.h>   #include <tchar.h>   #include <stdio.h>   // Prototypes   BOOL EjectVolume(TCHAR cDriveLetter);   HANDLE OpenVolume(TCHAR cDriveLetter);   BOOL LockVolume(HANDLE hVolume);   BOOL DismountVolume(HANDLE hVolume);   BOOL PreventRemovalOfVolume(HANDLE hVolume, BOOL fPrevent);   BOOL AutoEjectVolume(HANDLE hVolume);   BOOL CloseVolume(HANDLE hVolume);   LPTSTR szVolumeFormat = TEXT("\\\\.\\%c:");   LPTSTR szRootFormat = TEXT("%c:\\");   LPTSTR szErrorFormat = TEXT("Error %d: %s\n");   void ReportError(LPTSTR szMsg)   {       _tprintf(szErrorFormat, GetLastError(), szMsg);   }   HANDLE OpenVolume(TCHAR cDriveLetter)   {       HANDLE hVolume;       UINT uDriveType;       TCHAR szVolumeName[8];       TCHAR szRootName[5];       DWORD dwAccessFlags;       wsprintf(szRootName, szRootFormat, cDriveLetter);       uDriveType = GetDriveType(szRootName);       switch(uDriveType) {       case DRIVE_REMOVABLE:           dwAccessFlags = GENERIC_READ | GENERIC_WRITE;           break;       case DRIVE_CDROM:           dwAccessFlags = GENERIC_READ;           break;       default:           _tprintf(TEXT("Cannot eject.  Drive type is incorrect.\n"));           return INVALID_HANDLE_VALUE;       }       wsprintf(szVolumeName, szVolumeFormat, cDriveLetter);       hVolume = CreateFile(   szVolumeName,                               dwAccessFlags,                               FILE_SHARE_READ | FILE_SHARE_WRITE,                               NULL,                               OPEN_EXISTING,                               0,                               NULL );       if (hVolume == INVALID_HANDLE_VALUE)           ReportError(TEXT("CreateFile"));       return hVolume;   }   BOOL CloseVolume(HANDLE hVolume)   {       return CloseHandle(hVolume);   }   #define LOCK_TIMEOUT        10000       // 10 Seconds   #define LOCK_RETRIES        20   BOOL LockVolume(HANDLE hVolume)   {       DWORD dwBytesReturned;       DWORD dwSleepAmount;       int nTryCount;       dwSleepAmount = LOCK_TIMEOUT / LOCK_RETRIES;       // Do this in a loop until a timeout period has expired       for (nTryCount = 0; nTryCount < LOCK_RETRIES; nTryCount++) {           if (DeviceIoControl(hVolume,                               FSCTL_LOCK_VOLUME,                               NULL, 0,                               NULL, 0,                               &dwBytesReturned,                               NULL))               return TRUE;           Sleep(dwSleepAmount);       }       return FALSE;   }   BOOL DismountVolume(HANDLE hVolume)   {       DWORD dwBytesReturned;       return DeviceIoControl( hVolume,                               FSCTL_DISMOUNT_VOLUME,                               NULL, 0,                               NULL, 0,                               &dwBytesReturned,                               NULL);   }   BOOL PreventRemovalOfVolume(HANDLE hVolume, BOOL fPreventRemoval)   {       DWORD dwBytesReturned;       PREVENT_MEDIA_REMOVAL PMRBuffer;       PMRBuffer.PreventMediaRemoval = fPreventRemoval;       return DeviceIoControl( hVolume,                               IOCTL_STORAGE_MEDIA_REMOVAL,                               &PMRBuffer, sizeof(PREVENT_MEDIA_REMOVAL),                               NULL, 0,                               &dwBytesReturned,                               NULL);   }   AutoEjectVolume(HANDLE hVolume)   {       DWORD dwBytesReturned;       return DeviceIoControl( hVolume,                               IOCTL_STORAGE_EJECT_MEDIA,                               NULL, 0,                               NULL, 0,                               &dwBytesReturned,                               NULL);   }   BOOL EjectVolume(TCHAR cDriveLetter)   {       HANDLE hVolume;       BOOL fRemoveSafely = FALSE;       BOOL fAutoEject = FALSE;       // Open the volume.       hVolume = OpenVolume(cDriveLetter);       if (hVolume == INVALID_HANDLE_VALUE)           return FALSE;       // Lock and dismount the volume.       if (LockVolume(hVolume) && DismountVolume(hVolume)) {           fRemoveSafely = TRUE;           // Set prevent removal to false and eject the volume.           if (PreventRemovalOfVolume(hVolume, FALSE) &&               AutoEjectVolume(hVolume))               fAutoEject = TRUE;       }       // Close the volume so other processes can use the drive.       if (!CloseVolume(hVolume))           return FALSE;       if (fAutoEject)           printf("Media in Drive %c has been ejected safely.\n",                  cDriveLetter);       else {           if (fRemoveSafely)               printf("Media in Drive %c can be safely removed.\n",               cDriveLetter);       }       return TRUE;   }   void Usage()   {       printf("Usage: Eject <drive letter>\n\n");       return ;   }   void main(int argc, char * argv[])   {       if (argc != 2) {           Usage();           return ;       }       if (!EjectVolume(argv[1][0]))           printf("Failure ejecting drive %c.\n", argv[1][0]);       return ;   }				
Referensi
Untuk informasi lebih lanjut tentang IOCTLs dan fungsi yang dibahas dalam artikel ini, baca dokumentasi SDK Win32.

Untuk informasi tentang cara keluarkan media di Windows 95, gunakan bukti kunci thefollowing untuk Telisik di Pangkalan Pengetahuan Microsoft:
Keluarkan media yang dapat dilepas
Keluarkan cakram disk media yang dapat dilepas

Peringatan: Artikel ini telah diterjemahkan secara otomatis

Properti

ID Artikel: 165721 - Tinjauan Terakhir: 11/01/2015 01:59:00 - Revisi: 3.0

Microsoft Win32 Application Programming Interface

  • kbapi kbfileio kbhowto kbkernbase kbprogramming kbmt KB165721 KbMtid
Tanggapan