Depolama sürücüsü veri kümesi yönetimi gerçekleştirme

Windows 7'den başlayarak, sürücüler bir cihazın veri kümesinde yönetim eylemleri gerçekleştirebilir. Depolama cihazında gerçekleştirilebilecek veri kümesi yönetimi (DSM) eylemlerinin listesi Microsoft tarafından tanımlanır.

Verilerin Özelliklerini Yönetme için IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES kullanma

DEVICE_DSM_ACTION sabiti eylemi belirtir. Bu sabit, bir IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES isteğinin sistem arabelleğinde bulunan DEVICE_DSM_INPUT yapısının Eylem üyesine geçirilir. Eylem ek parametreler gerektiriyorsa, parametre bloğu hemen DEVICE_DSM_INPUT yapısını izler ve parameterBlockOffset parametre bloğunun başlatıldığı DEVICE_DSM_INPUT yapısının başlangıcından uzaklığı belirtir. Varsa veri kümesi aralıkları parametre bloğunu hemen izler ve DataSetRangesOffset , aralıkların başlatıldığı DEVICE_DSM_INPUT yapısının başlangıcından uzaklığı belirtir. Sistem arabellek yapısı aşağıdaki diyagramda gösterilmiştir.

DSM IOCTL Giriş Arabelleği.

Yönetim eylemi çıkış döndürecekse, IOCTL'nin OutputBuffer DEVICE_DSM_OUTPUT yapısına bir işaretçi geçirilir. Eylem eyleme özgü ek çıkış döndürecekse, çıkış bloğu hemen DEVICE_DSM_OUTPUT yapısını izler ve OutputBlockOffset parametre bloğunun başladığı DEVICE_DSM_OUTPUT yapısının başlangıcından uzaklığı belirtir. Çıkış arabelleği yapısı aşağıdaki diyagramda gösterilmiştir.

DSM IOCTL Çıkış Arabelleği.

DSM eyleminin işlem akışı

DSM eyleminin işlem akışı aşağıda açıklanmıştır; burada Gönderen eylem istek sahibidir ve İşleyici istenen eylemi işler. Yığında birden fazla İşleyicisi olabileceğini unutmayın.

DSM Eylem Akışı .

  1. Sender DSM'yi başlatır ve aşağıdakileri yaparak bunu yığındaki ilk İşleyicisi gönderir:

    • Eylemle ilişkilendirilmiş tanım ile bir DEVICE_DSM_DEFINITION yapısı ayırın ve başlatın.
    • Eylemin giriş arabelleği için gereken boyutu belirlemek için DeviceDsmGetInputLengthçağırın ve ardından bu arabellek için bellek ayırın.
    • DSM_DEVICE_INPUT yapısını başlatmak ve eylemin parametreleri varsa parametre bloğunu başlatmak için DeviceDsmInitializeInputçağırın. Parametre bloğu biçimi eyleme bağlıdır. Daha fazla bilgi için DEVICE_DSM_ACTION Açıklamalarına bkz..
    • Eylemin aralıkları varsa, her aralık için DeviceDsmAddDataSetRange komutunu, giriş arabelleğine DEVICE_DSM_RANGE yapısını eklemek amacıyla çağırın.
    • DSM'nin çıkışı varsa, eylemin çıkış arabelleği için gereken boyutu belirlemek üzere DeviceDsmGetOutputLength çağırın ve ardından bu arabellek için bellek ayırın.
    • Başlatılmış giriş verilerini IOCTL'nin sistem arabelleğine ve, varsa, ayrılmış çıkış arabelleğine geçirerek bir IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES isteği gönderin.
  2. İşleyici, DSM IOCTL isteğini üç farklı şekilde işler:

    1. İsteği işleyin ve varsa çıktıyı döndürün.
    2. İsteği işleyip yığındaki bir sonraki alt sürücüye iletin.
    3. DSM'yi işlemeden isteği yığındaki bir sonraki alt sürücüye iletin.

    Uyarı

    Sürücünün DSM'yi işleyip işlemediğinden bağımsız olarak, DEVICE_DSM_ACTION’ın en anlamlı biti (DeviceDsmActionFlag_NonDestructive) ayarlandıysa, istek'ı güvenle iletebilir. DeviceDsmActionFlag_NonDestructive ayarlanmadıysa, sürücü bunun yerine bir hata ile dönmelidir.

    İşleyicisi DSM'yi işlerse aşağıdaki adımları gerçekleştirir:

    • DeviceDsmValidateInputçağırarak girişi doğrulayın.
    • Giriş geçerliyse İşleyicisi eylemi almak için girişi ayıklar. Eylemin parametre bloğu varsa İşleyici, parametre bloğunu almak için DeviceDsmParameterBlockçağırır. Eylem aralık verilerine sahipse, İşleyiciDeviceDsmDataSetRanges çağırarak veri kümesi aralıklarının bloğuna bir işaretçi alır ve ardından blok üzerinde normal işlemi gerçekleştirir. Bu blok DataSetRangesOffset bulunur ve DEVICE_DSM_RANGE yapıları olarak biçimlendirilmiş bir veya daha fazla bitişik girdiden oluşur. Veri kümesi aralıklarının bayt cinsinden uzunluğu, DEVICE_DSM_INPUTDataSetRangesLength üyesinde ayarlanır.
    • Eylem çıktı gerektiriyorsa, İşleyici gönderen tarafından sağlanan çıkış arabelleğinin doğrulanması için DeviceDsmValidateOutputLengthçağırır. Geçerliyse işleyici, DeviceDsmInitializeOutputçağırarak çıkış arabelleğinin DEVICE_DSM_OUTPUT bölümünü başlatır ve varsa çıkış bloğunu eyleme özgü çıkışla doldurur. İşleyicisi IOCTL'yi tamamlar ve IOCTL'yi döndürür veya yığındaki sonraki sürücüye iletir.
  3. DSM işlenip Gönderengeri döndürüldükten sonra, Gönderen, varsa, DeviceDsmValidateOutputçağrısını yaparak çıktıyı doğrular. Çıkış geçerliyse, Sender varsa, DeviceDsmOutputBlockçağırarak çıkış bloğunu ayıklar.

Belirli her DSM eyleminin ayrıntıları için bkz. Cihaz DSM Eylem Açıklamaları.