• Thứ Tư, 22/08/2007 15:25 (GMT+7)

    Công nghệ nén áp dụng trong các bản vá của Microsoft

    Bạn đã bao giờ tự hỏi Microsoft tạo ra các bản vá cho phần mềm của họ như thế nào? Bạn muốn giảm thiểu dung lượng đường truyền khi cập nhật phần mềm cho người dùng Windows mà không muốn mua phần mềm thương mại thứ 3? Công nghệ Binary Delta Compression (viết tắt là BDC) sẽ là câu trả lời cho bạn. Khác với các công nghệ nén thông thường, BDC so sánh sự khác biệt giữa tệp đích và tệp tham chiếu (hay tệp cơ sở) rồi mới nén để tạo ra bản vá. Quá trình áp dụng bản vá cũng sử dụng hai đầu vào là tệp cơ sở và bản vá để tạo thành tệp đích. BDC được thiết kế đặc biệt để xử lý các tệp thực thi dạng PE của Windows, nhất là những tệp thực thi được viết để chạy trên dòng Intel i386 32-bit. Chính vì thế kích thước các bản vá thường nhỏ hơn nhiều so với việc nén tệp đích. Nếu tỷ lệ nén cho các tệp thực thi thường dao động quanh 3:1 thì tỷ lệ nén của bản vá so với tệp đích có thể nằm trong khoảng từ 10:1 tới 1000:1 và thậm chí có thể lớn hơn – tùy thuộc vào dung lượng tệp đích và mức độ khác biệt của nó với tệp cơ sở. Chẳng hạn như việc sửa chương trình để chặn một lỗ hổng tràn bộ đệm có thể chỉ tạo ra một bản vá vài trăm byte.

    Trong hầu hết các trường hợp, tệp đích và tệp cơ sở là hai phiên bản của cùng một chương trình hay thư viện. Tuy nhiên, BDC có thể áp dụng cho hai tệp bất kỳ và trong trường hợp xấu nhất, khi hai tệp đầu vào không có gì chung thì bản vá sẽ là tệp nén của tệp đích. Còn về độ tin cậy? Công nghệ BDC đã được ứng dụng thành công cho việc cập nhật phần mềm cho Microsoft Windows XP, Microsoft Windows Server 2003 và Microsoft Windows 2000. Ngoài việc làm giảm kích thước tệp cần phân phối, công nghệ vá BDC còn có một tác dụng phụ giúp bảo vệ bản quyền vì bản vá sẽ không có ý nghĩa nếu người dùng không có tệp thực thi cơ sở.

    Điều kiện và cách áp dụng BDC

    Công nghệ BDC gồm hai phần: tạo bản vá và dùng bản vá để tạo ra tệp đích. Thư viện cần thiết cho việc tạo tệp đích từ bản vá là mspatcha.dll đã có sẵn trong hệ điều hành kể từ Windows 2000 (nằm tại thư mục System32).

    Để tạo bản vá, chúng ta cần tải xuống và cài đặt bộ Windows Installer SDK từ địa chỉ http://www.microsoft.com/downloads/details.aspx?FamilyID=e96f8abc-62c3-4cc3-93ad-bfc98e3ae4a3&DisplayLang=en.

    Trong đó, những thành phần chính mà các lập trình viên cần quan tâm là:

    - mspatchc.dll: thư viện liên kết động cung cấp các hàm tạo bản vá

    - patchapi.h: Header file định nghĩa các hàm API, các cấu trúc và các hằng

    Delta Compression API không chỉ cung cấp các hàm đơn giản để tạo và sử dụng bản vá mà còn đem lại cho lập trình viên rất nhiều công cụ và tùy chọn. Riêng với hàm tạo bản vá, chúng ta có thể cung cấp đầu vào là một loạt các phiên bản cũ của tệp tin để yêu cầu tạo ra những bản vá khác nhau ứng với từng phiên bản đó. Lập trình viên cũng có thể chỉ định việc lựa chọn các phương pháp nén khác nhau hoặc bỏ qua việc tạo bản vá nếu nó có dung lượng lớn hơn dung lượng sau khi nén của tệp đích. Hơn thế nữa, để giúp cho quá trình tạo bản vá nhận biết thực chất của những thay đổi của chương trình và tạo ra bản vá tối ưu hơn, chúng ta còn có thể đưa thêm tham số đầu vào là các "symbol file" từ quá trình LINK. Những thông tin bổ sung đó không bị đưa vào bản vá và cũng sẽ không cần tới khi áp bản vá để tạo tệp đích.

    Vì mỗi bản vá sẽ tương ứng với một cặp tệp đích và tệp cơ sở nên Delta Compression API còn cung cấp các hàm xác định chữ ký của mỗi bản vá, kiểm tra (thử) bản vá xem nó có khớp với tệp cơ sở hay không.

    Để hiểu rõ hơn về các khái niệm và cách sử dụng Delta Compression API, các bạn có thể tham khảo chi tiết tại địa chỉ http://msdn2.microsoft.com/en-us/library/ms811406.aspx. Các bạn sử dụng Delphi có thể tham khảo cách gọi các hàm API đó tại địa chỉ http://delphi32.blogspot.com/2006/03/microsoft-patch-api.html. Với VB thì công việc không đơn giản nhưng cũng không đến nỗi bế tắc, chúng ta có thể tải xuống một wrapper DLL tại địa chỉ http://www.codeproject.com/tools/unpatcher.asp

    Việc sử dụng BDC không phải là đặc quyền của các lập trình viên, người dùng cuối và người quản trị có thể sử dụng các tiện ích chạy từ dòng lệnh được bao gồm trong Windows Installer SDK là mpatch.exe ("make patch") và apatch.exe ("apply patch"). Cú pháp của các tiện ích này như sau:

    mpatch old_file new_file patch_file

    apatch patchfile old_file new_file

    Ví dụ

    Để giúp các bạn hình dung cụ thể về tỷ lệ nén của BDC, xin trích giới thiệu một ví dụ đã đăng trên MSDN Blogs: Khi tạo bản vá để cập nhật thư viện mscordbi.dll từ V1.1 (có dung lượng 233.472 byte) lên V2.0 (có dung lượng 288.768 byte do được bổ sung thêm 50 phương thức mới) bằng tiện ích mpatch, chúng ta thu được bản vá có dung lượng 119.468 byte – chỉ bằng 40% của thư viện mới – trong khi tệp zip của mscordbi.dll V2 đã là 152 Kbyte.

    Với các cập nhật nhỏ, tỷ lệ nén còn tốt hơn nhiều. Bản vá để cập nhật V1.0 của mscordbi.dll (221.184 byte) lên V1.1 chỉ có 43.166 byte. V1.1 mscordbi.dll nén lại cũng còn 110 Kbyte, vì vậy bản vá vẫn nhỏ hơn 40% tệp nén phiên bản mới.

    Nguyễn Anh Tuấn
    124 Vương Thừa Vũ, Hà Nội.

    ID: A0708_143