1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#pragma once
#include <atlbase.h>
#include <atlcoll.h>
#include "winddk/ntddcdvd.h"
class CDVDSession
{
protected:
HANDLE m_hDrive;
DVD_SESSION_ID m_session;
bool BeginSession();
void EndSession();
BYTE m_SessionKey[5];
bool Authenticate();
BYTE m_DiscKey[6], m_TitleKey[6];
bool GetDiscKey();
bool GetTitleKey(int lba, BYTE* pKey);
public:
CDVDSession();
virtual ~CDVDSession();
bool Open(LPCTSTR path);
void Close();
operator HANDLE() const { return m_hDrive; }
operator DVD_SESSION_ID() const { return m_session; }
bool SendKey(DVD_KEY_TYPE KeyType, BYTE* pKeyData);
bool ReadKey(DVD_KEY_TYPE KeyType, BYTE* pKeyData, int lba = 0);
};
class CLBAFile : private CFile
{
public:
CLBAFile();
virtual ~CLBAFile();
bool IsOpen() const;
bool Open(LPCTSTR path);
void Close();
int GetLengthLBA() const;
int GetPositionLBA() const;
int Seek(int lba);
bool Read(BYTE* buff);
};
class CVobFile : public CDVDSession
{
// all files
struct file_t {
CString fn;
int size;
};
CAtlArray<file_t> m_files;
int m_iFile;
int m_pos, m_size, m_offset;
// currently opened file
CLBAFile m_file;
// attribs
bool m_fDVD, m_fHasDiscKey, m_fHasTitleKey;
CAtlMap<DWORD, CString> m_pStream_Lang;
int m_iChaptersCount;
CAtlMap<BYTE, LONGLONG> m_pChapters;
public:
CVobFile();
virtual ~CVobFile();
static bool GetTitleInfo(LPCTSTR fn, ULONG nTitleNum, ULONG& VTSN /* out */, ULONG& TTN /* out */); // video_ts.ifo
bool IsDVD() const;
bool HasDiscKey(BYTE* key) const;
bool HasTitleKey(BYTE* key) const;
bool Open(CString fn, CAtlList<CString>& files /* out */, ULONG nProgNum = 1); // vts ifo
bool Open(const CAtlList<CString>& files, int offset = -1); // vts vobs, video vob offset in lba
void Close();
int GetLength() const;
int GetPosition() const;
int Seek(int pos);
bool Read(BYTE* buff);
BSTR GetTrackName(UINT aTrackIdx) const;
int GetChaptersCount() const { return m_iChaptersCount; }
LONGLONG GetChapterOffset(UINT chapterNumber) const;
private:
CFile m_ifoFile;
DWORD ReadDword();
short ReadShort();
BYTE ReadByte();
void ReadBuffer(BYTE* pBuff, DWORD nLen);
};
|