+bool ImageWriter::InitializeFiles() {
+ if (!image_file_.IsValid()) {
+ image_file_.Initialize(image_path_,
+ base::File::FLAG_OPEN | base::File::FLAG_READ |
+ base::File::FLAG_EXCLUSIVE_READ);
+
+ if (!image_file_.IsValid()) {
+ DLOG(ERROR) << "Unable to open file for read: " << image_path_.value();
+ Error(error::kOpenImage);
+ return false;
+ }
+ }
+
+ if (!device_file_.IsValid()) {
+#if defined(OS_WIN)
+ // Windows requires that device files be opened with FILE_FLAG_NO_BUFFERING
+ // and FILE_FLAG_WRITE_THROUGH. These two flags are not part of base::File.
+ device_file_ =
+ base::File(CreateFile(device_path_.value().c_str(),
+ GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH,
+ NULL));
+#else
+ device_file_.Initialize(
+ device_path_,
+ base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE |
+ base::File::FLAG_EXCLUSIVE_READ | base::File::FLAG_EXCLUSIVE_WRITE);
+#endif
+ if (!device_file_.IsValid()) {
+ Error(error::kOpenDevice);
+ return false;
+ }
+ }
+
+ bytes_processed_ = 0;
+ running_ = true;
+
+ return true;
+}
+