Aracılığıyla paylaş


Nesne Tanıtıcılarını Doğrulama Hatası

Bazı sürücülerin, çağıranlar tarafından kendilerine geçirilen nesneleri işlemesi veya aynı anda iki dosya nesnesini işlemesi gerekir. Örneğin, bir modem sürücüsü bir olay nesnesinin tanıtıcısını alabilir veya ağ sürücüsü iki farklı dosya nesnesinin tanıtıcılarını alabilir. Sürücü bu tanıtıcıları doğrulamalıdır. Bunlar G/Ç yöneticisi aracılığıyla değil, çağıran tarafından geçirildiğinden, G/Ç yöneticisi herhangi bir doğrulama denetimi gerçekleştiremez.

Örneğin, aşağıdaki kod parçacığında sürücüye AscInfo-AddressHandle> tanıtıcısı geçirilmiştir, ancak ObReferenceObjectByHandle çağrılmadan önce doğrulanmamıştır:

   //
   // This handle is embedded in a buffered request.
   //
   status = ObReferenceObjectByHandle(
                      AscInfo->AddressHandle,
                      0,
                      NULL,
                      KernelMode,
                      &fileObject,
                      NULL);

   if (NT_SUCCESS(status)) {
       if ( (fileObject->DeviceObject == DeviceObject) &&
            (fileObject->FsContext2 == TRANSPORT_SOCK) ) {

ObReferenceObjectByHandle çağrısı başarılı olsa da, kod döndürülen işaretçinin bir dosya nesnesine başvurdığından emin olamaz; çağıranın doğru bilgileri geçirmesine güvenir.

ObReferenceObjectByHandle çağrısının tüm parametreleri doğru olsa ve çağrı başarılı olsa bile, dosya nesnesi sürücüsü için tasarlanmamışsa sürücü yine de beklenmeyen sonuçlar alabilir. Aşağıdaki kod parçasında, sürücü başarılı bir çağrının beklediği dosya nesnesine bir işaretçi döndürdüğünü varsayar:

   status = ObReferenceObjectByHandle (
                             AcpInfo->Handle,
                             0L,
                             DesiredAccess,
                             *IoFileObjectType,
                             Irp->RequestorMode,
                             (PVOID *)&AcpEndpointFileObject,
                             NULL);

   if ( !NT_SUCCESS(status) ) {
      goto complete;
   }
   AcpEndpoint = AcpEndpointFileObject->FsContext;

   if ( AcpEndpoint->Type != BlockTypeEndpoint ) 

ObReferenceObjectByHandle bir dosya nesnesine işaretçi döndürse de, sürücü işaretçinin beklediği dosya nesnesine başvurduğunu garanti etmemektedir. Bu durumda, sürücü AcpEndpointFileObject-FsContext> konumundaki sürücüye özgü verilere erişmeden önce işaretçiyi doğrulamalıdır.

Bu tür sorunları önlemek için, bir sürücü aşağıdaki gibi geçerli verileri denetlemelidir:

  • Sürücünün beklediği şey olduğundan emin olmak için nesne türünü denetleyin.

  • İstenen erişimin nesne türü ve gerekli görevler için uygun olduğundan emin olun. Örneğin, sürücünüz hızlı bir dosya kopyalama yapıyorsa, tanıtıcının okuma erişimine sahip olduğundan emin olun.

  • Doğru erişim modunu (UserMode veya KernelMode) belirttiğinizden ve erişim modunun istenen erişimle uyumlu olduğundan emin olun.

  • Sürücü, sürücünün kendi oluşturduğu bir dosya nesnesi için tanıtıcı bekliyorsa, tanıtıcıyı cihaz nesnesine veya sürücüsüne karşı doğrulayın. Ancak, garip cihazlar için G/Ç istekleri gönderen filtreleri kesmemeye dikkat edin.

  • Sürücünüz birden çok dosya nesnesi türünü destekliyorsa (denetim kanalları, adres nesneleri ve TDI sürücülerinin bağlantıları veya Dosya sistemlerinin Birim, Dizin ve Dosya nesneleri gibi), bunları ayırt etmek için bir yolunuzun olduğundan emin olun.