2017-04-30 13 views
2

Windows 7에서 CD 볼륨의 일련 번호 (xxxx-xxxx)를 계산하는 프로그램을 작성 중입니다. 프로그램이 iso9660 및 joilet 파일 시스템을 사용하여 디스크의 볼륨 일련 번호를 올바르게 결정합니다. 그러나 파일 시스템 udf를 사용하여 디스크 볼륨 스니퍼를 정의하는 방법은 무엇입니까? 누군가가 내가 https://extra-torrent.jimdo.com/2016/01/23/hard-disk-volume-serial-number-change/ 그것은이 질문처럼 보인다udf cd/dvd 디스크 볼륨의 일련 번호를 가져 옵니까?

#include <QCoreApplication> 
#include <stdio.h> 
#include <sys/ioctl.h> 
#include <linux/cdrom.h> 
#include <string.h> 
#include <szi/szimac.h> 
#include <qfile.h> 
#include <iostream> 
#include <QDir> 
#include <unistd.h> 

#define SEC_SIZE 2048 
#define VD_N 16 
#define VD_TYPE_SUPP 2 
#define VD_TYPE_END 255 
#define ESC_IDX 88 
#define ESC_LEN 3 
#define ESC_UCS2L1 "%/@" 
#define ESC_UCS2L2 "%/C" 
#define ESC_UCS2L3 "%/E" 
using namespace std; 
int cdid(unsigned char pvd[SEC_SIZE]) 
{ 

    unsigned char part[4] = {0}; 
    int i; 
    for(i = 0; i < SEC_SIZE; i += 4) 
    { 
     part[3] += pvd[i + 0]; 
     part[2] += pvd[i + 1]; 
     part[1] += pvd[i + 2]; 
     part[0] += pvd[i + 3]; 
    } 

    return (part[3] << 24) + (part[2] << 16) + (part[1] << 8) + part[0]; 
} 
int main(int argc, char *argv[]) 
{ 
     FILE *in; 
     unsigned char buf[SEC_SIZE]; 
     struct cdrom_multisession msinfo; 
     long session_start; 
     int id; 

     QString home=QString(getenv("HOME"))+QString("/chteniestorm"); 
     QFile file(home); 

     ustr="/dev/sr0"; 
     in = fopen(ustr.toLocal8Bit().data(), "rb"); 
     if(in == NULL) 
     { 
      if (file.open(QIODevice::WriteOnly)) 
      { 
       file.write("sernom=1"); 
       file.close(); 
      } 
      cout<<"netdiska"<<endl; 
      return 0; 
     } 
     /* Get session info */ 
     msinfo.addr_format = CDROM_LBA; 

     if(ioctl(fileno(in), CDROMMULTISESSION, &msinfo) != 0) 
     { 
      fprintf(stderr, "WARNING: Can't get multisession info\n"); 
      perror(NULL); 
      session_start = 0; 
     } 
     else 
     { 
      session_start = msinfo.addr.lba; 
     } 

     fseek(in, 0, SEEK_SET); //to the begining 



     /* Seek to primary volume descriptor */ 
     if(fseek(in, (session_start + VD_N) * SEC_SIZE, SEEK_SET) != 0) 
     { 
      if (file.open(QIODevice::WriteOnly)) 
      { 
       file.write("sernom=2"); 
       file.close(); 
      } 
      fclose(in); 
      return 0; 
     } 

     /* Read descriptor */ 
     if(fread(buf, 1, SEC_SIZE, in) != SEC_SIZE) 
     { 
      if (file.open(QIODevice::WriteOnly)) 
      { 
       file.write("sernom=3"); 
       file.close(); 

      } 
      fclose(in); 
      return 0; 
     } 

     /* Caclculate disc id */ 
     id = cdid(buf); 

     /* Search for Joliet extension */ 
     while(buf[0] != VD_TYPE_END) 
     { 
      /* Read descriptor */ 
      if(fread(buf, 1, SEC_SIZE, in) != SEC_SIZE) 
      { 
      perror(NULL); 
      return 0; 
      } 

      if(buf[0] == VD_TYPE_SUPP 
       && (memcmp(buf + ESC_IDX, ESC_UCS2L1, ESC_LEN) == 0 
        || memcmp(buf + ESC_IDX, ESC_UCS2L2, ESC_LEN) == 0 
        || memcmp(buf + ESC_IDX, ESC_UCS2L3, ESC_LEN) == 0) 
       ) 
       { 
        /* Joliet found */ 
        id = cdid(buf); 
       } 
     } 
     fclose(in); 
} 

답변

-1

이 더 많은 장소 [1]에 요청했다 이런 종류의 일련 번호에 대해서 이야기하고 이해하지 않으면 누군가가 ... [2]

PS를 말해 줄 수 , [3], [4] 그러나 아무데도 아직 대답하지 않았습니다. 그래서 여기에서 할 것입니다.

일부 게시물에서는 사람들이 일련 번호 생성 알고리즘을 해독했습니다. 이미 확인한 체크섬입니다. cdid() 기능에 넣으십시오. 동일한 체크섬 알고리즘이 Windows의 ISO9660 및 UDF 파일 시스템에 사용됩니다. ISO9660 구조체에서 계산 된 체크섬을 이미 알아 냈습니다.

그럼 UDF 파일 시스템에만 문제가 남아 있습니다. Windows의 UDF 파일 시스템의 경우 체크섬은 512 바이트 길이의 FSD (File Set Descriptor) 구조에서 계산됩니다. 을 읽고 UDF 디스크에서 해당 FSD를 로켈하는 방법을 제안합니다.

가상 할당 테이블 (VAT), 예비 테이블 또는 메타 데이터 파티션을 사용하지 않는 일반 UDF의 경우 FSD의 위치는 LVD (Logical Volume Descriptor) 구조의 LogicalVolumeContentsUse 필드에 저장됩니다 (long_ad 유형 임) . LVD는 VDS (Volume Descriptor Sequence)에 저장됩니다. VDS의 위치는 AnVor Volume Descriptor Pointer (AVDP)의 MainVolumeDescriptorSequenceExtent 필드에 저장됩니다. AVDP 자체는 매체의 섹터 256에 있습니다. 광 매체는 섹터 크기가 2048 바이트이고 공통 하드 디스크는 512 바이트입니다.

VAT가있는 UDF (예 : CD-R/DVD-R), 스페어 링 테이블 (예 : CD-RW/DVD-RW) 또는 메타 데이터 파티션 (예 : 블루 레이)의 경우 훨씬 더 복잡합니다. FSD의 논리적 위치를 미디어의 실제 위치로 변환하는 방법을 파악하려면 가상, 공유 가능 또는 메타 데이터 파티션을 조사해야합니다.

버전 1.4부터 시작하는 udftools 프로젝트에는 UDF 파일 시스템에 대한 다양한 정보를 제공하는 새로운 도구 udfinfo이 있습니다. 그것은 또한 해당 Windows 특정 볼륨 일련 번호winserialnum 키 아래의 질문에서 보여줍니다. udfinfo는 VAT 또는 메타 데이터가있는 UDF 파일 시스템에서 FSD를 읽을 수 없습니다.

+0

왜 downvoted? 제 대답을 조용히 -1로 표시하는 대신 잘못된 내용과 개선 방법을 설명해주십시오. – Pali