Drive Floppy Virtual Kehidupan Kedua

Suatu ketika saya memiliki koleksi Windows versi lama di mesin virtual, dan untuk mentransfer file antara mesin host dan mesin virtual ini, saya harus menggunakan floppy disk, karena dukungan folder bersama hanya muncul di Windows for Workgroups.



Mentransfer file melalui floppy lambat dan berisik, dan kegembiraan saya tidak terbatas ketika saya menemukan driver Floppy Drive Virtual, yang memungkinkan Anda membuat "drive floppy virtual" dan menghubungkannya ke VM seperti biasa. Sayangnya, ketertarikan penulis pada proyeknya memudar pada tahun 2005, dan pada tahun 2010 situs web dan emailnya tidak ada lagi. Sejak itu, banyak perubahan terjadi di dunia Windows:



  • OS 64-bit banyak digunakan, di mana tidak mungkin untuk memuat driver 32-bit yang dikompilasi pada tahun 2005;
  • Windows mulai dari Vista SP1 mulai memerlukan tanda tangan digital atau manipulasi suram yang memerlukan booting ulang sistem untuk memuat driver;
  • Proyek yang ditulis dalam Visual C ++ 6 tidak dibangun dalam versi Visual Studio modern setelah konversi otomatis.


Sudah pada tahun 2011, milis pengembang ReactOS membahas penyediaan dukungan untuk proyek yang ditinggalkan; tetapi tanpa persetujuan penulis sendiri, ini tidak mungkin terjadi, dan pada saat itu penulis belum menunjukkan tanda-tanda kehidupan selama beberapa tahun. Kemudian seorang Andriy G. Tereshchenko membuat mirror tidak resmi vfd.sourceforge.net dengan salinan situs web penulis yang hilang. SourceForge masih memiliki versi 2005 di sana, dan masih ada keluhan bahwa versi ini tidak berfungsi di Windows 7+.



Saya ingin terus mengembangkan PKS di github.com/tyomitch/vfd ; bahkan jika Anda acuh tak acuh terhadap PKS itu sendiri, maka cerita saya dapat membantu Anda untuk "menghidupkan kembali" proyek lain yang ditinggalkan di bawah Windows.



Kompilasi



Visual Studio 2019 setuju untuk membuka vfd.dswdan mengubah proyek konstituennya ke format modern; tetapi konversi belum selesai, sehingga proyek yang dikonversi menolak untuk dikompilasi.



Saya menemukan masalah berikut:



  • Panggilan Message Compiler ( mc $(InputName)) diubah dengan tidak benar - alih-alih mc %(Filename)di VS2019, panggilan seharusnya diubah mc %(FullPath). Nama file yang dibuat untuk MC ( $(InputName).hdan $(InputName).rc) tidak dikonversi sama sekali; di VS2019, mereka akan terlihat seperti %(Filename).hdan %(Filename).rc.
  • Nama file yang dihasilkan untuk Resource Compiler ( $(IntDir)\$(InputName).res) juga tidak dikonversi; di VS2019 mereka akan terlihat seperti $(IntDir)\%(Filename).res.
  • <TargetName>perlu diubah dari default ( $(ProjectName)) vfdmenjadi proyek vfdlibdan vfdwinproyek vfdwin, jika tidak mereka mencoba membangun lib.dlldan gui.exe.
  • Untuk mengkompilasi VFD tanpa zlib, Anda tidak hanya perlu menambahkan definisi VFD_NO_ZLIB, tetapi juga menghapus #include "zlib.h"sub #ifndef VFD_NO_ZLIB- penulis untuk beberapa alasan lupa tentang ini; dan perlu dihapus zlibstat.libdari <AdditionalDependencies>.


Setelah perbaikan ini, versi 32-bit vfd.dlldan vfdwin.exe; tetapi untuk membangun versi 64-bit, Anda perlu bekerja lebih keras.



Adaptasi untuk x64



Pertama, kodenya sendiri tidak kompatibel dengan x64, dan Anda perlu mengganti
  • jenis pengembalian semua DlgProcdari BOOLke INT_PTR;
  • semua panggilan GetWindowLong(GWL_USERDATA)ke GetWindowLongPtr(GWLP_USERDATA)dan serupa untuk SetWindowLongdan untuk DWL_MSGRESULTdan DWL_USER.


Kedua, ini tidak digunakan dalam pengaturan proyek yang dikonversi $(Platform), karena pada saat VC6 hanya ada satu platform; dan oleh karena itu, file 32-bit dan 64-bit mencoba dikumpulkan di direktori yang sama. Untuk berkembang biak mereka, harus dikoreksi pada $(IntDir)nilai-nilai <AssemblerListingLocation>, <PrecompiledHeaderOutputFile>, <ObjectFileName>, <ProgramDataBaseFileName>; <OutputFile>untuk penghubung, perbaiki ke $(TargetPath); dan menghapus yang tidak berguna <AdditionalLibraryDirectories>, menambahkan ketergantungan antar proyek <PostBuildEvent>secara manual , dan secara manual menyalin file yang dikompilasi ke direktori target.



Ketiga, vfdwinsecara aktif menolak mencoba berjalan pada Windows 64-bit, serta mencoba berjalan pada Windows 95/98 / Me. Untuk menghentikan ini, Anda perlu menghapus fungsi VfdIsValidPlatform()dan semua referensi ke dalamnya.



Unduh driver



Saya tidak memiliki Windows DDK, jadi saya mengambil 64-bit yang vfd.sysdikompilasi oleh critical0 tertentu dan bertanyadartraidenmenandatanganinya dengan "cara Cina kuno". Pengandar seperti itu memuat dan bekerja dengan sukses jika vfdwindiluncurkan dengan hak administrator; agar ini selalu terjadi, Anda perlu menambahkan opsi tautannya <UACExecutionLevel>RequireAdministrator.



Penggemar lain, Igor Levicki, telah mendedikasikan seluruh posting blog untuk mengkompilasi vfd.sysx64, dan mengklaim bahwa versinya vfd.sys lebih baik daripada critical0; tetapi ditandatangani dengan sertifikat buatan sendiri dan tidak dapat dimuat tanpa isyarat tambahan. Selain sertifikat buatan sendiri, Igor Levicki yang ambisius menambahkan penyebutan dirinya dan blognya ke file driver; critical0 tidak melakukan omong kosong seperti itu.



Menggunakan



Selain perubahan yang terdaftar, saya baru saja mengganti URL yang sudah lama mati di jendela Tentang di github.com/tyomitch/vfd , dan memperbaiki satu bug di shell, yang hanya terlihat selama kompilasi debug: fungsi VfdGetLocalLinkmeneruskan parameter tipe CHARke isalpha()dan membuang pada baris _ASSERTE(c >= -1 && c <= 255);di pustaka standar. Seperti dijelaskan dalam habrapost baru - baru ini , perilaku isalpha()tidak ditentukan untuk angka negatif, tetapi CHARdi Windows hanya ditandatangani. Dilihat dari fakta bahwa 141 peringatan dikeluarkan selama kompilasi, mungkin masih ada banyak bug seperti itu di dalam kode; jadi saya akan melakukan sesuatu dengan malam gratis saya.



Biner siap ada di github.com/tyomitch/vfd/tree/master/x64/Debug



All Articles